Rails 4,将过滤器应用于已安装的引擎操作

时间:2013-07-28 14:58:26

标签: ruby-on-rails ruby-on-rails-4

在Rails 4中,使用已安装引擎的应用程序时,有两个ApplicationController

  • class ApplicationController < ActionController::Base申请
  • 发动机
  • class MyEngine::ApplicationController < ActionController::Base

由于引擎ApplicationController未从应用程序ApplicationController继承,因此应用于应用程序的过滤器不会应用于引擎。

如何将before_actionafter_actionaround_action应用于所有应用程序路由,包括已挂载引擎中的路由?当然,不要触及引擎代码。

非常感谢。

3 个答案:

答案 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引擎中,即孩子不应强迫父母做某事。