Возможно, вы также захотите взглянуть на инициализаторы внутри вашего подкласса движка, поэтому вам не нужно включать помощники вида в ваш класс контроллера. И это даст вам контроль над порядком загрузки этих модулей.
Вот что я использовал:
module MyEngine
class Engine < Rails::Engine
initializer 'my_engine.helper' do |app|
ActionView::Base.send :include, MyEngineHelper
end
initializer 'my_engine.controller' do |app|
ActiveSupport.on_load(:action_controller) do
include MyEngineActionControllerExtension
end
end
end
end
Кроме того, еще одна опция для расширения контроллера действий использует модуль mixin. Это позволит вам использовать before_filter, after_filter и т.д ..
module MyEngineActionControllerExtension
def self.included(base)
base.send(:include, InstanceMethods)
base.before_filter :my_method_1
base.after_filter :my_method_2
end
module InstanceMethods
#...........
end
end
Еще одна вещь ... если вы создаете каталоги rails по умолчанию на верхнем уровне вашего драгоценного камня, вам не нужно беспокоиться о необходимости помощников или контроллеров. Ваш подкласс движка имеет к ним доступ. Поэтому я добавляю свой контроллер приложений и вспомогательные расширения приложений здесь:
/myengine/app/helpers/myengine_application_helper_extension.rb
/myengine/app/controllers/my_engine_action_controller_extension.rb
Мне нравится эта настройка, потому что она похожа на application_controller и application_helper в вашем приложении rails. Опять же, это всего лишь личные предпочтения, но я стараюсь сохранить все, что напрямую связано с рельсами, например контроллеры, помощники и модели внутри / my_engine / app и все, что связано с плагином в целом, внутри / my_engine / lib
Ознакомьтесь с этим руководством Хосе Валима для получения дополнительной информации об инициализаторах:
https://gist.github.com/e139fa787aa882c0aa9c (engine_name устарело сейчас, но большая часть этого документа выглядит актуальной)