3

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

  • class ApplicationController < ActionController::Base对于应用程序
  • class MyEngine::ApplicationController < ActionController::Base用于发动机

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

我如何应用一个或所有应用程序路由,包括来自已安装引擎的那些before_action?当然,无需接触引擎代码。after_actionaround_action

非常感谢。

4

3 回答 3

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

于 2013-07-28T15:04:02.337 回答
0

您可以在引擎的 engine.rb 文件中添加过滤器

initializer :append_before_action do
   ActionController::Base.send :before_action, :do_a_thing
end
于 2016-06-28T14:29:08.620 回答
0

201 中的 FWIW,大约是 rails 5.2,有更好的方法来做到这一点。这个问题的要点围绕着引擎命名空间的隔离

将您想要在主应用程序 ApplicationController 中的方法添加到 Rails 引擎的 ApplicationHelper 模块中。

然后通过Engine load hook将它们混合到您的应用程序中。(在你的 engine.rb 文件中)

ActiveSupport.on_load(:action_controller_base) {
  include Yourengine::ApplicationHelper
}

这些方法现在在您的应用程序的 ApplicationController 中可用。

您现在可以将before_action添加到 Rails 应用程序的应用程序控制器中。我认为之前的操作应该是 Rails 应用程序中的显式操作,而不是 Rails 引擎中的操作,即孩子不应该强迫他们的父母做某事。

于 2018-10-25T22:04:29.493 回答