2009-06-15 3 views
0

У меня есть несколько объектов, которые невероятно похожи. Фактически, они используют STI и хранят все данные в одной таблице в БД. В настоящее время, каждый раз, когда я добавляю функцию или исправляю ошибку, я должен обновить ее в 3 разных местах, поэтому я хотел бы немного сушить мой код. Наиболее распространенное дублирование кода в представлениях. Я видел людей, использующих render :template => 'shared/something', чтобы отобразить их общие взгляды, проблема в том, что у меня их много, но только для одного конкретного объекта (Отгрузки), поэтому я бы предпочел что-то вроде render :template => 'shipments/shared/something' или render :template => 'abstract_shipments/something'. Что еще более важно, я хотел бы, чтобы любой из реальных классов мог переопределить шаблон, если это необходимо.Rails - Аннотация/общие сведения

У вас есть предложения по тому, как это сделать? Большое спасибо за любые ответы!

ответ

1

Плагин inherit_views может сделать эту работу: http://github.com/ianwhite/inherit_views/tree/master. Я использовал его раньше.

Тогда у вас может быть общий класс базового контроллера для всех контроллеров, которым необходимо отображать отгрузки, и иметь общие шаблоны в папке представлений базового контроллера с любыми определенными переопределениями в папках представлений отдельных контроллеров.

+0

Спасибо, это похоже на то, что мне нужно! –

0

Классы (по крайней мере, модели) не должны или не должны знать о том, как они отображаются. Это имеет фундаментальное значение для разделения проблем, связанных с шаблоном MVC.

Я думаю, что я хотел бы попробовать что-то вроде этого:

Используйте один контроллер для всех моделей STI, ShipmentsController или что-то подобное. Помимо того, что это кажется логичным, все ваши взгляды окажутся в одном и том же месте, что должно помочь.

Что касается представлений, как насчет «основного» для общих частей и одного частичного для каждого набора полей подкласса? Используйте case на ваш взгляд, или, возможно, более аккуратно, вспомогательный метод, что-то вроде

def partial_name_for_subclass(obj) 
    if obj.is_a?(CrudeOilShipment) # or kind_of? or test the type column or use respond_to? 
    'crude_oil_shipment' 
    # etc 
    end 
end 

сушилке, рассмотреть вопрос об использовании конвенции (Rails любит конвенции):

<%= render :partial => @shipment.class.name.downcase, :locals => { :item => @shipment } %> 

, где у вас есть частичный для каждый подкласс.

Надеюсь, что это помогает/имеет смысл ...

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