Два контроллера для одного общего представления в Ruby on Rails - PullRequest
25 голосов
/ 23 января 2009

У меня есть два контроллера для двух соответствующих моделей, например, фотографии и категории. Методы index и show очень похожи в каждом контроллере, а представления идентичны. Каков наилучший метод для разделения зрения двух моделей?

У меня есть два варианта:

  • Используйте помощника. В помощник поместит код для представления и вызовет помощника из каждого представления (фотографии / просмотры и категории / представления)

  • Используйте частичное в каждом представлении. Я думаю, что это более чистое решение, но я вижу огромные СУХОЕ при кодировании этого решения.

Итак, у меня есть два контроллера из двух моделей, каждая на и показывает объект @photo (контроллер фотографий со всеми фотографиями и контроллер категорий только с фотографиями выбранной категории), и мне нужен один вид, чтобы показать обе.

Я ищу элегантное решение для этого, жалуясь на принципы REST и DRY. Есть идеи?

Заранее спасибо.

Ответы [ 5 ]

38 голосов
/ 23 января 2009

У меня похожая ситуация с одним из моих проектов. Все представления удаления для большинства контроллеров стилизованы одинаково, отображают одинаковые поля подтверждения и просто отображают предсказуемое отображение любого удаляемого объекта.

На мой взгляд, решение было довольно простым и элегантным. Проще говоря, мы (разработчики) создали новый каталог в app/views с именем shared и разместили там общие представления. Это могут быть полные файлы шаблонов или просто частичные.

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

например. есть метод как таковой в обоих контроллерах и файле app/views/shared/photo.html.erb:

def show
  @photo = Photo.first # ... or whatever here
  render :template => 'shared/photo'
end

Это должно успешно сделать общий шаблон. Это самый СУЩЕСТВЕННЫЙ маршрут, и у него нет ощущения загрязнения, которое вы получаете при использовании более или менее пустого представления в каталоге представлений каждого контроллера, просто для включения разделяемой части, как я понимаю, ваш вопрос предлагает.

6 голосов
/ 31 июля 2009

О первый ответ:

Если часть должна быть визуализирована из вида:

<%= render :partial => "shared/photo" %>

и частичное должно быть в app / views / shared / _photo.html.erb

1 голос
/ 11 ноября 2011

Это похоже на хороший вариант использования Cells gem.

1 голос
/ 23 января 2009

Я бы использовал помощника, потому что они являются общими для представлений. Для части HTML я бы использовал партиалы, поэтому это было бы сочетание обоих способов.

0 голосов
/ 18 июля 2013

@ bjeanes Если все ваши виды удаления одинаковы, вы можете создать views / default / delete.html.erb, и все действия по удалению будут использовать его.

Это то, что я делаю: большинство моих представлений по умолчанию, и я создаю определенные только при необходимости

Обновление: Хорошо, это сообщение за 2009 год, во всяком случае, я буду держать свой комментарий здесь на случай, если кто-то попадет сюда из Google, как я.

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