Расширение 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