Два контроллера для одного общего вида в Ruby on Rails
У меня есть два контроллера для двух соответствующих моделей, например, фотографии и категории. индексы и методы отображения очень похожи в каждом контроллере, а представления идентичны. Каков наилучший способ совместного использования представления двумя моделями?
У меня есть два варианта:
-
Используйте помощник. В помощнике поместите код для представления и вызовет помощника из каждого вида (фотографии/виды и категории/представления).
-
Используйте частичное в каждом представлении. Я думаю, что это более чистое решение, но я вижу огромный СУХОЙ, когда собираюсь кодировать это решение.
Итак, у меня есть два контроллера из двух моделей, каждый из которых размещает объект @photo (фотоконтроллер со всеми фотографиями и контроллер категорий только с выбранными фотографиями категории), и мне нужно одно представление, чтобы показать оба.
Я ищу элегантное решение для этого, жалуясь на принципы REST и DRY. Любая идея?
Спасибо заранее.
Ответы
Ответ 1
У меня похожая ситуация с одним из моих проектов. Все виды удаления для большинства контроллеров оформлены одинаково, отображаются одинаковые поля подтверждения и просто отображаются предсказуемое отображение любого объекта, который удаляется.
Решение было довольно простым и элегантным, на мой взгляд. Проще говоря, что мы (разработчики) сделали, это создать новый каталог в app/views
, называемый shared
, и поместить в него общие представления. Это могут быть полные файлы шаблонов или просто частичные.
Я бы предложил использовать общий шаблон (ни в каталогах, ни в каталогах просмотра фотографий, а в общем каталоге) и рендеринг его вручную из представления.
например. имеют как метод как в обоих контроллерах, так и в файле app/views/shared/photo.html.erb
:
def show
@photo = Photo.first # ... or whatever here
render :template => 'shared/photo'
end
Это должно успешно выполнить общий шаблон. Это маршрут DRYest и не имеет ощущения загрязнения, которое вы получаете при использовании более или менее пустого представления в каждом каталоге представлений диспетчера, чтобы включить общий частичный код, как я понимаю, ваш вопрос предлагает.
Ответ 2
Об ответе первый:
Если частичное изображение должно быть отображено из представления:
<%= render :partial => "shared/photo" %>
а частичное должно быть в приложении/views/shared/_photo.html.erb
Ответ 3
Я бы использовал помощника, потому что они разделены между представлениями. Для части HTML я использовал бы частичные, поэтому это было бы сочетание обоих способов.
Ответ 4
Это выглядит как хороший вариант использования Cells gem.
Ответ 5
@bjeanes Если все ваши виды просмотров одинаковы, вы можете создавать представления /default/delete.html.erb, и все действия по удалению будут использовать его.
Это то, что я делаю: большинство моих просмотров по умолчанию, и я создаю конкретные только при необходимости
Обновление: Хорошо, это сообщение с 2009 года, во всяком случае, я сохраню свой комментарий здесь, если кто-то попадет сюда из Google, как я.