Расширение ActionController::Base из движка Rails 4

Я пытаюсь продлить 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)

Как это сделать, и где я должен правильно разместить файлы?

1 ответ

Решение

Это может быть легко достигнуто изнутри двигателя Engine класс, например:

class Engine < ::Rails::Engine

  ActionController::Base.class_eval do

     include Some::Module

  end

end

Однако этот подход подразумевает, что любое изменение в Some::Module требуется перезагрузка сервера, чтобы загрузить это изменение. Это может раздражать, поэтому, возможно, использование простого ООП-наследования решит эту проблему еще лучше.

В этом случае движок снабдит некоторый контроллер логикой, назовем его EngineController, Теперь иерархия контроллеров будет выглядеть так:

class EngineController < ActionController::Base; end # provided with an engine
class MainAppController < EngineController; end
Другие вопросы по тегам