Rails: две переменные экземпляра или только одна и создайте другую в представлении - PullRequest
0 голосов
/ 17 января 2012

У меня есть сомнения в хороших манерах в Rails, и я верю в MVC в целом. У меня есть контроллер, который извлекает некоторые объекты из модели с учетом конкретного условия. Мне нужны эти объекты в представлении, а также мне нужна определенная структура данных с атрибутами этих объектов. Эта структура данных выглядит так:

[[object1.attr1, object1.attr2],[object2.attr2,object2.attr2],...]

Мой вопрос:

Должен ли я создать две переменные экземпляра в контроллере: одну со всеми объектами, извлеченными из модели, а другую со структурой данных, созданной из атрибутов этих объектов, или я должен просто создать одну переменную экземпляра со всеми объектами и создать эту структуру данных в представлении?

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Это зависит, но вы не должны создавать структуры данных в представлении.

Либо делайте это в функции контроллера, либо, если он тесно связан с моделью, в модели. Из ограниченного описания это звучит так, как будто это принадлежит модели, но сложно сказать.

1 голос
/ 17 января 2012

Вы можете переместить часть своего кода из ваших представлений в:

  1. a помощник вида
  2. контроллер
  3. модель

A Rails Helper (опция 1) кажется более подходящей для вашего случая.Если вам нужно, например, заполнить тег select, то помощник с методом, который возвращает options_for_select(...your complex structure formatted), будет правильным выбором.

Вы можете использовать options_for_select (из направляющих ) таким образом

<%= options_for_select([[object1.attr1, object1.attr2],[object2.attr2,object2.attr2],...], 2) %> станет:

<option value="object1-attr2-value">object1-attr1-value</option>
<option value="object2-attr2-value" selected="selected">object2.attr1-value</option>
...

Вы можете добавитьэтот метод внутри ApplicationHelper (если это необходимо для всего приложения) или в помощнике для конкретной модели:

# app/helpers/...the helper you choose
def options_for_your_complex_select(default_state)
  options_for_select( [[object1.attr1, object1.attr2],[object2.attr2,object2.attr2],...],
                  default_state )
end

и используйте этот помощник в своих представлениях таким образом (пожалуйста, выберителучшее имя метода, чем у меня :)): <%= select_tag :state, options_for_your_complex_select(params[:default_state]) %>

Это поможет вам сделать ваш код более управляемым, а представление - более читабельным. Rails лучшие практики веб-сайт имеет больше об этом.Посмотрите, как переместите свой код в ViewHelper , Модель и Контроллер .

Если вам приходится иметь дело смножество атрибутов, этот скринкаст о драгоценном драпировке от @ryanb объясняет, как упростить ваши представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...