0

我正在尝试ActionController::Base从 rails 4 引擎扩展,以便安装它的任何应用程序在每个操作之前运行特定方法。现在我知道可能有几种不同的方法可以做到这一点,比如关注点,class_eval或者开放分类,但我对这一切都很陌生,我能找到的链接主要是关于如何从主应用程序扩展引擎控制器,而不是就像我正在尝试的那样。

这是我尝试过的,我在引擎的控制器文件夹中创建了一个新文件夹,如下所示:

my_engine
  |-- app
        |-- controllers
              |-- action_controller
                  |-- base_controller.rb
              |-- my_engine
                  |-- some_controller.rb
                  |-- other_controller.rb

并在base_controller.rb我添加了以下内容:

require_dependency "action_controller/base"

module ActionController
  class BaseController

    before_action :some_method

    private
    def some_method
      #just for testing
      redirect_to 'http://www.google.com'
    end
  end
end

这不起作用。我认为这是因为它没有被加载(我仍在尝试了解如何以及在哪里将这样的自定义代码放置在 rails 引擎中),所以我尝试将该代码复制到my_engine/lib/my_engine/engine.rb文件中,但随后出现以下错误启动服务器时:

undefined method `before_action' for ActionController::BaseController:Class (NoMethodError)

如何做到这一点,我应该在哪里正确放置文件?

4

1 回答 1

2

它可以从引擎Engine类中轻松实现,例如:

class Engine < ::Rails::Engine

  ActionController::Base.class_eval do

     include Some::Module

  end

end

然而,这种方法意味着任何更改都Some::Module需要重新启动服务器以加载该更改。这可能很烦人,所以也许使用简单的 OOP 继承会更好地解决这个问题。

在这种情况下,引擎将为一些控制器提供逻辑,让我们称之为EngineController。现在,控制器层次结构如下所示:

class EngineController < ActionController::Base; end # provided with an engine
class MainAppController < EngineController; end
于 2014-11-13T18:00:05.383 回答