0

У меня есть базовый набор контроллеров с довольно стандартным набором методов RESTful. Затем у меня есть второй набор контроллеров для управления клиентскими микросайтами. Второй набор контроллеров почти идентичен базовому набору, за исключением того, что для каждого метода, который отвечает HTML, требуется дополнительная переменная экземпляра, представляющая идентификатор микросайта (который недоступен для базовых контроллеров), который должен быть определен.DRYing in Inherited Methods in Rails Controllers

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

Например, если у меня есть UsersController ниже:

class UsersController < ApplicationController 
    def index 
    end 
end 

А потом у меня есть клиенты :: UsersController < < UsersController ниже:

class Clients::UsersController < UsersController 
    def index 
     @client_id = params[:id] 
    end 
end 

Как высыхают Клиенты :: UsersController ?

+1

Очень трудно сказать вам что-нибудь полезное, так как вы опустили все соответствующий код. На этом этапе мы могли бы предложить «положить« много контроля потока »в метод» и не намного больше. – meagar

+0

Код не очень уместен. Это не вопрос конкретного кода. Это вопрос о шаблонах проектирования. Я мог бы разместить весь код для моего контроллера, но 99% этого вопроса не имеет отношения к этому вопросу, поэтому я выбрал общий пример. – ACIDSTEALTH

ответ

2

Вы, вероятно, после concern:

# app/controllers/concerns/do_something.rb 

module DoSomething 
    include ActiveSupport::Concern 

    def something 
    # Shared code goes here 
    end 
end 

В контроллерах ...

class UsersController < ApplicationController 
    include DoSomething 

    def index 
     # Invoke shared code 
     something 
    end 
end 

class Clients::UsersController < UsersController 
    include DoSomething 

    def index 
     @client_id = params[:id] 

     # Invoke shared code 
     something 
    end 
end