在Rails 4中,使用已安装引擎的应用程序时,有两个ApplicationController
:
class ApplicationController < ActionController::Base
申请class MyEngine::ApplicationController < ActionController::Base
由于引擎ApplicationController
未从应用程序ApplicationController
继承,因此应用于应用程序的过滤器不会应用于引擎。
如何将before_action
,after_action
或around_action
应用于所有应用程序路由,包括已挂载引擎中的路由?当然,不要触及引擎代码。
非常感谢。
答案 0 :(得分:3)
您可以创建一个更改ActionController :: Base
的初始值设定项 class ActionController::Base
before_action :do_a_thing
def do_a_thing
puts "did something" #or whatever
end
end
将其粘贴在rb文件中并将其放入config / initializers
答案 1 :(得分:0)
您可以在引擎的engine.rb文件中添加过滤器
initializer :append_before_action do
ActionController::Base.send :before_action, :do_a_thing
end
答案 2 :(得分:0)
FWIW在201,大约5.2的轨道上,有一种更好的方法。该问题的要点围绕isolation of the Engine's namespace。
在主应用程序ApplicationController中将所需的方法添加到Rails Engine的ApplicationHelper模块中。
然后通过an Engine load hook将它们混合到您的应用程序中。 (在您的engine.rb文件中)
ActiveSupport.on_load(:action_controller_base) {
include Yourengine::ApplicationHelper
}
这些方法现在可以在应用程序的ApplicationController中使用。
您现在可以将 before_action 添加到Rails应用程序的应用程序控制器中。我认为before动作应该是在Rails应用程序中的显式操作,而不是在Rails引擎中,即孩子不应强迫父母做某事。