Почему люди предлагают не использовать переменную экземпляра для представлений в Ruby on Rails

12

Почему я слышал, что нехорошо делить переменные экземпляра между контроллерами и представлениями. Мне это нравится, потому что через @ я сразу вижу, что с контроллера что-то идет. Я вижу хороший способ использовать помощников в контроллерах здесь: http://www.stephencelis.com/2008/09/06/rails-controllers-views-and-variables.html . Но я использую канкан для этой порции.

Амала
источник

Ответы:

11

Идея была воплощена в лучших методах рельсов: замените переменную экземпляра локальной переменной

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

Тем не менее, если вы используете много партиалов и, следовательно, имеете много переменных экземпляра, объявленных в вашем контроллере ..., это может быть менее запутанным, если вы используете альтернативу явной передачи переменной контроллера (экземпляра) в партиалы. Таким образом, при работе с частичным ПРОСМОТРОМ у вас есть одна явная ссылка на переменную / объект, с которой вы хотите работать, которая не используется совместно со всеми частями, включенными в создание страницы.

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

Инго
источник
5

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

# controller 
def index
  @var = 1
end

#view index.html.erb 
<%= @var %><br/>
<%= render 'foo' %><br/>
<%= @var %>

#partial _foo.html.erb
<%= @var = 2 %>

результат будет

1
2
2

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

#view index.html.erb 
<%= @var %><br/>
<%= render 'foo', var: @var %><br/>
<%= @var %>

#partial _foo.html.erb
<%= var = 2 %>

результат:

1
2
1
Grzegorz
источник
2
Это хороший момент, я не думал об изменчивости переменных. У меня было предположение, что контроллер «представляет» переменные представлениям, но переменные экземпляра могут определенно вносить ошибки, если они изменяются.
Амала