You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动在所有Active Admin页面控制器中引入ActivityHelper concern?

问题

我有一个如下的Concern:
文件路径:./app/controllers/concerns/activity_helper.rb

module ActivityHelper
  extend ActiveSupport::Concern

  included do
    before_action :my_method, except: %i[update destroy]
  end

  def my_method
    ...
  end

目前需要手动将该Concern引入到多个Active Admin页面控制器中,示例如下:
文件路径:./app/admin/dashboard.rb

controller do
  include ActivityHelper
end

我尝试了以下方案,但未生效且无报错:

  1. 在./app/controllers/concerns/active_admin_controller_concern.rb中创建新模块:
module ActiveAdminControllerConcern
   extend ActiveSupport::Concern

   included do
       controller do
          include ActivityHelper
       end
   end
end
  1. 在./config/initializers/active_admin.rb中添加如下方法与配置:
def add_active_admin_controller_concern
  ActiveAdmin::ResourceDSL.send(:include, ActiveAdminControllerConcern)
end
ActiveAdmin.setup do |config|
  config.before_action :add_active_admin_controller_concern
end

请问如何实现仅将ActivityHelper模块自动引入到所有Active Admin页面控制器中?

解决方案

方式一:直接给ActiveAdmin基类注入(最简单)

Active Admin所有页面的控制器都继承自ActiveAdmin::BaseController,直接给这个基类引入你的Concern即可:

打开./config/initializers/active_admin.rb,添加以下代码(可放在ActiveAdmin.setup块内部或外部):

# 先确保ActivityHelper被加载
require_dependency Rails.root.join('app', 'controllers', 'concerns', 'activity_helper')

# 给所有Active Admin控制器注入ActivityHelper
ActiveAdmin::BaseController.send(:include, ActivityHelper)

方式二:通过ResourceDSL全局配置(贴合ActiveAdmin DSL风格)

如果你想沿用ActiveAdmin的DSL方式扩展,可通过修改ResourceDSL实现全局注入:

同样在./config/initializers/active_admin.rb中添加:

require_dependency Rails.root.join('app', 'controllers', 'concerns', 'activity_helper')

ActiveAdmin::ResourceDSL.class_eval do
  # 全局给所有资源的控制器引入ActivityHelper
  controller do
    include ActivityHelper
  end
end

原方案失效原因

你之前的做法存在两个核心问题:

  • config.before_action是用来给HTTP请求添加前置处理动作的,不是用来扩展DSL的,时机和用途都不对
  • 你给ResourceDSL引入的自定义Concern,其内部的included块写法不符合ResourceDSL的扩展逻辑,无法正确触发控制器的Concern注入

内容的提问来源于stack exchange,提问作者adhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:25:15