Сколько кода в представлении рельсов в порядке? - PullRequest
5 голосов
/ 15 апреля 2009

Я знаю, что лучше не пускать код на уровень представления. Но мне интересно, сколько считается "приемлемым". Например, я заполняю поле выбора html этой строкой кода.

CodesecureProject.find(:all,:order => 'name').collect {|project| [project.name, project.id] }

Прямо сейчас у меня есть эта строка кода, встроенная в форму. Что мне интересно, если сообщество считает, что это слишком много кода, и он должен быть сначала сохранен в переменной экземпляра на контроллере, а затем в переменной, используемой в форме.

Ответы [ 4 ]

5 голосов
/ 15 апреля 2009

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

Если я использую один и тот же компонент HTML в нескольких представлениях, то я могу обнаружить, что тянусь к частичкам или оборачиваю все это в свой собственный помощник: project_select () или что-то подобное.

Чем больше я работаю в мире MVC, тем больше я избегаю кода в представлениях. У меня есть ощущение, что какое-то мастерство в дзен будет достигнуто, если я достигну состояния с нулевым кодом, хотя ценность этого в чем-то другом, кроме философских, весьма спорна.

4 голосов
/ 15 апреля 2009

Я использую следующий статический метод в модели сайта для достижения чего-то похожего:

class Site
  def self.select_options
    Site.find(:all, :order => 'UPPER(name)').collect {|s| [s.name, s.id]}
  end
def

Тогда в моем доменном представлении я звоню:

<%= f.select :site_id, Site.select_options %>

Это очень хорошо подходит для этих обстоятельств.

В вашем случае вы можете попробовать:

class CodesecureProject
  def self.select_options
    CodesecureProject.find(:all, :order => 'name').collect {|p| [p.name, p.id]}
  end
end

А затем вызвать его через представление с помощью:

<%= f.select :codesecure_project_id, CodesecureProject.select_options %>
1 голос
/ 15 апреля 2009

Я бы пошел немного дальше, чем Маран. Обычно я делаю следующее:

  • Создайте named_scope в модели для выполнения поиска.
  • Вызовите named_scope из контроллера и сохраните результаты в переменной экземпляра.
  • Только поместите переменную экземпляра в представление.

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

1 голос
/ 15 апреля 2009

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

named_scope :order, lambda { |order| {:order => order}}

и сделайте код:

CodesecureProject.order(:name).collect {|project| [project.name, project.id] }

Это немного чище.

Если у вас есть много полей выбора, которым нужно имя и идентификатор (я иногда это знаю), вы также можете попробовать создать помощника, который исключает ModelName и возвращает нужный массив.

def magic_for_select(model)
  model.all.collect{|instance| [instance.name, instance.id]}
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...