Как правильно расширить контроллеры Rails Engine? - PullRequest
4 голосов
/ 11 октября 2011

Я разрабатываю плагин 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): В главном приложении создайте новый контроллер, который подклассов двигателя + редактирует маршруты, чтобы они указывали на этот новый контроллер.

Я все еще уверен, что существуют еще лучшие решения. Пожалуйста, поправьте меня, если они это сделают!

Ответы [ 2 ]

4 голосов
/ 11 октября 2011

Ваш вариант 2) хорош, потому что он позволит вам легко обновить самоцвет.

Ваш текущий способ просто переопределяет существующий контроллер.

Скажем, вы хотите продлить FooController.

  1. Создайте файл с именем foo_controller_decorator.rb в папке инициализатора

  2. В файле:

FooController.class_eval do
  #your additionnal code here.
end
1 голос
/ 01 июля 2016

Я знаю, что это очень старый вопрос, но в случае, если кто-то еще найдет этот вопрос, вот драгоценный камень, который отлично подходит для декораторов. Он подключается к Rails ActiveSupport и добавляет соглашение к созданию декораторов, которое защищено от циклических зависимостей. Некоторое время мы использовали его в работе над несколькими приложениями.

https://github.com/EPI-USE-Labs/activesupport-decorators

...