1

У меня есть двигатель, и в моем основном приложении у меня есть контроллеры, наследующие некоторые контроллеры двигателя.Рельсовые двигатели: Наследование контроллеров и маршруты

class UsersController < MyEngine::UsersController 

end 

Как заставить мой движок использовать субконтроллеры без необходимости воссоздавать все мои маршруты в главном приложении?

---- с декораторов (раствор JensD в):

Я добавил к моему engine.rb файл

config.to_prepare do 
    Dir.glob(Rails.root + "app/decorators/**/my_engine/*_decorator*.rb").each do |c| 
    require_dependency(c) 
    end 
end 

и декоратора

MyEngine::MyController.class_eval do 
end 

Но super не представляется возможным. ..

Решение будет заключаться в создании субконтроллера в моем двигателе и использовать декоратор на нем, но это кажется странным ...

+0

Есть два способа сделать это. 1. Просто переопределите контроллер самого двигателя. 2. Вы можете взглянуть на class_eval, который будет переоценивать ваш контроллер с дополнительной логикой внутри контроллера «decorator». – JensDebergh

+0

Да, я использую первый путь, но маршруты используют родительский контроллер, чтобы заставить их использовать субконтроллер (без перезаписи). – Zak

+1

Вы фактически не перекрываете контроллер от двигателя. Вы просто подклассифицируете его, что означает его совершенно другой контроллер с тем же поведением «MyEngine :: UsersController». Для переопределения создать этот файл: 'приложение/контроллеры/my_engine/users_controller.rb' В этом файле убедитесь, что определение класса внутри модуля под названием' MyEngine' Это будет полностью переопределить контроллер. Я думаю, что ваша самая лучшая и безопасная ставка заключается в том, чтобы пойти с декоратором контроллера. Потому что вы потеряете всю логику, когда полностью переопределите. или переписывать маршруты не по-другому. – JensDebergh

ответ

0

Я предпочитаю использовать этот камень для декораторов вместо require_dependency:

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

С этим драгоценным камнем или вашей require_dependency вы можете использовать:

alias_method :super_index, :index 
def index 
    ... 
    super_index 
end 
+0

Спасибо, это прекрасно! – Zak