2010-03-22 2 views
4

Каковы ваше решение проблемы, если у вас есть модель, которая как не-гнездовая и вложенная, например, продукты:высыхания Rails Просмотров с вложенными ресурсами

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

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

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

Как вы справляетесь, что в ваших взглядах правильно?

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

Похоже, я должен был бы иметь взгляды, как это:

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

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

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

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

ответ

2

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

0

У меня нет хорошего и чистого решения этой проблемы. Обычно, если взгляды не сильно отличаются, я использую один вид и добавляю код @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.

0

Вид будет обработан 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 
Смежные вопросы