4

Я разрабатываю плагин Rails (это 3.1 Engine) под названием Carrier (https://github.com/stanislaw/carrier).Как правильно управлять контроллерами Rails Engine?

В одном из моих приложений rails я хочу расширить контроллер Carrier с помощью некоторых новых методов - fx. добавьте новое действие #comment_form в Carrier :: MessagesController (я хочу, чтобы это действие существовало только в моем приложении - я не хочу добавлять его в Engine, потому что это очень специфично).

Две стратегии я вижу здесь:

1) скопировать {плагин корень Перевозчика} /app/controllers/carrier/messages_controller.rb файл приложения/контроллеры/носителя/папки моего приложения, а затем продлить его (все исходные действия плагина также скопированы в папку контроллеров приложений rails!).

2) Более точный способ, который я хочу - это просто создать {My rails app} /app/controllers/carrier/messages_controller.rb и написать только метод #comment_form. Я хочу, чтобы Carrier был расширен.

Ожидая, что содержимое двух контроллеров (оригинал из папки плагина + пользовательский в моем приложении для рельсов, имеющий только новый #comment_form), будет наложен, я попробовал второй способ. Но Rails затем перестала распознавать все оригинальные действия Carrier (#index, #show и т. Д.), Написанные в папке messages_controller.rb из папки плагина Carrier, и начала обрабатывать версию messages_controller.rb приложения rails как единственную (все начальные действия начали обрабатываться как пустые и, таким образом, начали отображаться по стандартным потокам условных обозначений рельсов).

Итак, мой вопрос в целом: Как добавить новые действия в контроллеры Rails Engine, не копируя их полностью в папку приложений/контроллеров Rails?

UPD

Сейчас я вижу два решения, которые позволяют продлить контроллеры двигателя без серьезного хаки (как этот камень делает: https://github.com/asee/mixable_engines из этой темы: Extending controllers of a Rails 3 Engine in the main app)

1) Нагрузка YourEngine :: Двигатель .config.root + 'app' + 'controllers' + 'your_controller' внутри your_controller.rb, который находится в папке # {main_app}/app/controller/your_engine. Уведомление загрузить вместо требуемого.

2) Представьте способ (согласно некоторым тем темам): В главном приложении создайте новый контроллер, который подклассифицирует движок one + edit, чтобы указать на этот новый контроллер.

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

+0

Возможно, это проблема с пространством имен? Просто предположим, но если Ruby увидит объект MessageController в пространстве имен приложений Rails, он будет использовать его для любых вызовов методов внутри этого пространства имен. – coreyward

ответ

4

Ваш вариант 2) в порядке, потому что он позволит вам легко модернизировать драгоценный камень.

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

Скажите, что вы хотите расширить FooController.

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

  2. В файле:

FooController.class_eval do 
    #your additionnal code here. 
end 
+0

Спасибо за ответ. Я знаю, что могу это сделать. Мне просто интересно, почему это переоценивается из-за того, как это можно сделать в разработке - https://github.com/plataformatec/devise/wiki/How-To:-Change-the-redirect-path-after-destroying -a-сессии, то есть подписывания выход? (переопределение только одного действия) –

+0

В этом случае ваше приложение определяет ApplicationController, а некоторые действия включены внутри, если вы уже не определили его. – apneadiving

+0

Чтобы использовать ту же логику, создайте модуль с дополнительным действием и включите его в желаемый контроллер. – apneadiving

1

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

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