ОСУШЕНИЕ представлений Rails с помощью вложенных ресурсов

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

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

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

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

Как правильно обращаться с этим в своих представлениях?

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

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

  • продукты/index.haml
  • продукты/show.haml
  • события/продукты/index.haml
  • события/продукты/show.haml

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

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

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


person Lance Pollard    schedule 22.03.2010    source источник


Ответы (3)


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

person fl00r    schedule 22.03.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 версию.

person klew    schedule 24.03.2010

Представления будут обрабатываться 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
person iGbanam    schedule 28.07.2011