Rails - абстрактный / общий вид - PullRequest
0 голосов
/ 16 июня 2009

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

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

Ответы [ 2 ]

1 голос
/ 16 июня 2009

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

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

0 голосов
/ 16 июня 2009

Классы (по крайней мере, модели) ничего не знают или не должны знать о том, как они отображаются. Это фундаментально для разделения проблем, обеспечиваемых шаблоном 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

DRYer, рассмотрите возможность использования соглашения (Rails любит соглашения):

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...