Я разрабатываю плагин 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, чтобы указать на этот новый контроллер.
Я все еще уверен, что существуют даже более совершенные решения. Пожалуйста, поправьте меня, если они это сделают!
Возможно, это проблема с пространством имен? Просто предположим, но если Ruby увидит объект MessageController в пространстве имен приложений Rails, он будет использовать его для любых вызовов методов внутри этого пространства имен. – coreyward