Как сделать вид проще, а контроллер полезнее? - PullRequest
2 голосов
/ 29 июня 2010

Этот вопрос относится к очистке представления и увеличению объема работы контроллера.

В моем проекте много случаев, когда в моем представлении отображались вложенные переменные.Например:

# controller
@customers = Customer.find_all_by_active(true)
render :layout => 'forms'

# view
<% @customers.each do |c| %>
  <%= c.name %>
  <% @orders = c.orders %>  # I often end up defining nested variables inside the view
    <% @orders.each do |o| %>
    ...
    <% end %>
<% end %>

Я довольно новичок в RoR, но мне кажется, что то, что я делаю здесь, противоречит менталитету «умный контроллер, тупой взгляд».Там, где у меня много клиентов, у каждого из которых много заказов, как я могу правильно определить эти переменные в моем контроллере, а затем получить к ним доступ в представлении?

Если бы вы могли привести пример того, как контроллер будет выглядеть и как это сделатьЯ бы сказал, что это будет невероятно полезно.Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 30 июня 2010

Не думаю, что с вашим кодом что-то не так. Я бы просто предложил вам использовать :include в вашей находке

@customers = Customer.find_all_by_active(true, :include => :orders)

для уменьшения количества запросов.

2 голосов
/ 30 июня 2010

Я не думаю, что в том, что вы делаете, есть что-то радикально неправильное.Цикл по клиентам и вывод их некоторых атрибутов и для каждого клиента, цикл по их заказам и вывод некоторых атрибутов - это очень ориентированная на представление операция.

В архитектуре MVC контроллер отвечает за взаимодействие смодель, выбирая представление и (конечно, в случае с Rails) предоставляя в представление информацию, необходимую для визуализации модели.

Вы можете рассмотреть возможность извлечения кода в помощник вида, если у вас есть такойТочный код повторяется более одного раза.Вы могли бы даже обобщить это, передавая название модели и ассоциации.Я не проверял это, но вы должны быть в состоянии сделать что-то вроде этого:

def display_attributes(models, association, attribute, association_attribute)
  content = ''
  models.each do |m|
    content << "<p>#{m.attribute}</p>"
    associated_models = m.association
    associated_models.each do |am|
      content << "<p>#{am.association_attribute}</p>"
    end
  end
  content
end

Тогда в представлении вы можете использовать помощника следующим образом:

<%= display_attributes(@customers, orders, name, name) %>

Очевидно,вы бы изменили разметку HTML внутри вспомогательного метода в соответствии с вашими требованиями.Обратите внимание, что если вы не используете Rails 3, вам может понадобиться экранировать вывод имен атрибутов в вспомогательном методе.

0 голосов
/ 30 июня 2010

Я не вижу ничего плохого в коде, как вы показали.

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

...