2014-09-03 9 views
4

Учитывая, у меня есть класс А, который является своего рода абстрактным и инкапсулирует логику, которая необходима в decendants B и C.Наследование как реализовать абстрактный контроллер

class A 
end 

class B < A 
end 

class C < A 
end 

Кроме того, если есть изобретательной маршрутизации, который обеспечивает маршруты для B и C, и поэтому обрабатываются соответствующими контроллерами.

высыхать, что я переехал общий код обоих conntrollers в «абстрактном» контроллера (никогда не инстанцирован и без каких-либо маршрутов в своих действиях):

class AController < ApplicationController 
    def new(additional_opts) 
    render locals: {base: "stuff"}.merge(additional_opts) 
    end 
end 

class BController < AController 
    def new 
    super(foo: 1) 
    end 
end 

class CController < AController 
    def new 
    super(bar: 1) 
    end  
end 

действию контроллера Usally не имеет параметров. Но так как ACcontroller должен быть абстрактным, этот подход может быть действительным или лучше полагаться на переменные экземпляра и просто называть super, а затем вытаскивать нужную информацию из переменных вместо этого?

Любые идеи приветствуются.

Edit 1:

К счастью Lateralu42 предложил Заботы, который заставляет меня думать о том, хорошо, в чем мой реальный вопрос, здесь я хочу иметь андерсера? (Как в путеводителе по hitch hikers). Так что также о том, какой метод повторного использования кода?

Обнаружено красивое сообщение в блоге here.

+2

Ваш подход является правильным. Просто потому, что это контроллер, это не означает, что вы не можете иметь методы с параметрами и должны полагаться на переменные экземпляра. –

ответ

2

На самом деле, я думаю, ваша проблема может быть решена с помощью шаблона проблем (модуль совместно между контроллерами или моделями): How to use concerns in Rails 4

+0

Я тоже знаком с проблемами, но для меня они, похоже, не подходят здесь, так как я хочу использовать только функциональные возможности и только в том случае, если они ACcontroller. – jethroo

Смежные вопросы