Я разрабатываю плагин Rails (это движок 3.1) под названием Carrier (https://github.com/stanislaw/carrier< /а>).
В одном из моих приложений rails я хочу расширить контроллер Carrier некоторыми новыми методами — fx. добавить новое действие #comment_form в Carrier::MessagesController (я хочу, чтобы это действие существовало только в моем приложении — я не хочу добавлять его в Engine — потому что оно очень специфичное).
Здесь я вижу две стратегии:
1) Я копирую файл {корень плагина Carrier}/app/controllers/carrier/messages_controller.rb в папку app/controllers/carrier/ моего приложения, а затем расширяю его (все исходные действия плагина также копируются в папку контроллеров приложений rails! ).
2) Я хочу более точного способа - просто создать {My rails app}/app/controllers/carrier/messages_controller.rb и написать только метод #comment_form, который я хочу использовать для расширения Carrier.
Ожидая, что содержимое двух контроллеров (исходное из папки плагина + настраиваемое в моем приложении rails, имеющее только новый #comment_form) будет накладываться друг на друга, я попробовал второй способ. Но затем Rails перестал распознавать все исходные действия Carrier (#index, #show и т. д.), записанные в messages_controller.rb из папки плагина Carrier, и начал рассматривать версию messages_controller.rb приложения rails как единственную (все исходные действия начали обрабатываться как пустой и, таким образом, начал рендеринг через поток по умолчанию для соглашений о рельсах).
Итак, мой вопрос в целом: как добавить новые действия в контроллеры Rails Engines, не копируя их полностью в папку приложений/контроллеров Rails?
UPD
На данный момент я вижу два решения, которые позволяют расширять контроллеры движка без серьезных хаков (как это делает этот гем: https://github.com/asee/mixable_engines из этой темы: Расширение контроллеров движка Rails 3 в основном приложении)
1) загрузите YourEngine::Engine.config.root + 'app' + 'controllers' + 'your_controller' внутри your_controller.rb, который находится в папке #{main_app}/app/controller/your_engine. Обратите внимание на load вместо require.
2) Разработайте способ (согласно некоторым темам SO): в основном приложении создайте новый контроллер, который подклассифицирует один движок + отредактируйте маршруты, чтобы они указывали на этот новый контроллер.
Я все еще уверен, что существуют еще лучшие решения. Пожалуйста, поправьте меня, если они делают!