СУШКА Rails Представлений с Вложенными Ресурсами - PullRequest
4 голосов
/ 23 марта 2010

Каково ваше решение проблемы, если у вас есть модель, которая не является вложенной и вложенной, например, продукты:

«Продукт» может принадлежать - сказать «Событие», и Продукт также может быть просто независимым.

Это означает, что у меня могут быть такие маршруты:

map.resources :products # /products
map.resources :events do |event|
  event.resources :products # /events/1/products
end

Как вы справляетесь с этим в своих взглядах?

Примечание: это для панели администратора. Я хочу иметь страницу «Создать событие» с боковой панелью для создания заявок (Продукт), форм и проверки, кто rsvp'd. Таким образом, вы нажмете кнопку на боковой панели «Билеты на мероприятие», и вы попадете на /events/my-new-event/tickets. Но есть также корневая вкладка «Продукты» для админ-панели, на которой можно перечислить билеты и другие случайные продукты. Представления 'tickets' и 'products' выглядят одинаково на 90%, но в билетах будет некоторая информация о событии, к которому оно относится. Кажется, у меня должны быть такие взгляды:

  • товары / index.haml
  • товары / show.haml
  • События / продукция / index.haml
  • События / продукция / show.haml

Но это не похоже на СУХОЙ. Или я мог бы выполнить условную проверку, чтобы увидеть, было ли в продукте событие (@product.event.nil?), но тогда было бы трудно понять представления.

Как вы справляетесь с этими ситуациями?

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 23 марта 2010

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

0 голосов
/ 28 июля 2011

Представления будут обрабатываться ProductsController. Вы можете изменить логику в вашем контроллере в зависимости от вложенности ресурса.

# app/controller/products_controller.rb
# ...some code...
def index
    @event = Event.find_by_id(params[:event_id]) if params[:event_id]
    @products = @event ? @event.products : Product.all
end

Вид будет обработан обычным видом продукта

# app/views/products/index.html.haml
- unless @products.blank?
    - @products.each do |product|
        %p= product.some_attribute
0 голосов
/ 24 марта 2010

У меня нет хорошего и чистого решения этой проблемы. Обычно, если представления не сильно отличаются друг от друга, я использую одно представление и добавляю некоторый код, например @product.event.nil?. Вы всегда можете добавить некоторую переменную или хелпер, который сделает этот метод короче, например has_event? - тогда ваш взгляд будет выглядеть чище. И используйте это в коде так:

<% if has_event? %>
  some html
<% end %>

или для одной строки:

<%= link_to 'Something special', foo_path if has_event? %>

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

<%= render :partial => '/shared/products/info' %>

и т. Д.

Но если они не сильно отличаются, я бы действительно использовал if версию.

...