Я разрабатываю плагин Rails (это 3.1 Engine) под названием Carrier (https://github.com/stanislaw/carrier).
)
В одном из моих приложений rails я хочу расширить контроллер Carrier новыми методами - fx. добавить новое действие #comment_form в Carrier :: MessagesController (я хочу, чтобы это действие существовало только в моем приложении - я не хочу добавлять его в Engine - потому что оно очень специфично).
Две стратегии, которые я вижу здесь:
1) Я копирую файл {root корневого плагина Carrier} /app/controllers/carrier/messages_controller.rb в папку app / controllers / carrier / моего приложения, а затем расширяю его (все исходные действия плагина копируются в контроллеры приложений rails папка тоже!).
2) Более точный способ, которым я хочу, - это просто создать {My rails app} /app/controllers/carrier/messages_controller.rb и написать только метод #comment_form, с которым я хочу расширить Carrier.
Ожидая, что содержимое двух контроллеров (оригинал из папки плагина + custom в моем приложении rails, имеющем только новый #comment_form) будет заменен, я попробовал второй способ. Но Rails затем перестал распознавать все оригинальные действия Carrier (#index, #show и т. Д.), Записанные в messages_controller.rb из папки плагина Carrier, и начал рассматривать версию приложения messages_controller.rb приложения rails как единственную (все оригинальные действия начали обрабатываться как пустой и, таким образом, начал отображаться через поток по умолчанию для рельсовых конвенций).
Итак, мой вопрос в общем:
Как добавить новые действия в контроллеры Rails Engines, не копируя их полностью в папку Rails app / controllers?
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. Обратите внимание нагрузка вместо требуется.
2) Разработать способ (согласно некоторым темам SO):
В главном приложении создайте новый контроллер, который подклассов двигателя + редактирует маршруты, чтобы они указывали на этот новый контроллер.
Я все еще уверен, что существуют еще лучшие решения. Пожалуйста, поправьте меня, если они это сделают!