Подтвердить что ты не робот

Два контроллера для одного общего вида в Ruby on Rails

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

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

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

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

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

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

Спасибо заранее.

4b9b3361

Ответ 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, как я.