如何自动在所有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
我尝试了以下方案,但未生效且无报错:
- 在
./app/controllers/concerns/active_admin_controller_concern.rb中创建新模块:
module ActiveAdminControllerConcern extend ActiveSupport::Concern included do controller do include ActivityHelper end end end
- 在
./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
相关产品推荐
相关产品推荐

