Dlaczego ludzie sugerują, aby nie używać zmiennej instancji dla widoków w Ruby on Rails

Odpowiedzi:

11

Pomysł został wprowadzony w najlepszych praktykach dotyczących szyn: Zastąp zmienną instancji zmienną lokalną

Zasadniczo, jeśli nie używasz wielu części lub masz pojedynczy widok dla każdej metody kontrolera, użycie zmiennych instancji w widoku tak naprawdę nie spowoduje żadnych problemów.

Niemniej jednak, jeśli używasz wielu stronic, a zatem masz wiele zmiennych instancji zadeklarowanych w kontrolerze ..., może to być mniej mylące, jeśli użyjesz alternatywy jawnego przekazania zmiennej (instancji) kontrolera (części). W ten sposób - podczas pracy w częściowym WYŚWIETLACZU - masz jedno wyraźne odniesienie do zmiennej / obiektu, z którym chcesz pracować, a które nie jest współużytkowane z „wszystkimi” częściami, które są zawarte w tworzeniu strony.

W końcu możesz sobie z tym poradzić tak, jak chcesz to zrobić, nikt nie powie ci, aby zrobić to inaczej. Moim osobistym poglądem jest jednak to, że podoba mi się pomysł wyraźnych odniesień w moich częściach / widokach, których nie można mylić z innymi zmiennymi.

Ingo
źródło
5

Możesz uzyskać analogię ze globalzmiennych lub zmiennych przekazywanych przez referencję i myśleć o częściach cząstkowych jako funkcjach. Zatem użycie zmiennej instancji przypomina zmienną przekazaną do funkcji jako odniesienie ze wszystkimi jej zaletami i wadami:

# controller 
def index
  @var = 1
end

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

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

wynik będzie

1
2
2

Możesz chcieć takiego zachowania, ale w większości przypadków nie byłoby to potrzebne. W ten sposób łatwiej jest wprowadzić błędy i trudniej je wyśledzić. Dlatego jest to zalecane, ponieważ oddziela zakresy zmiennych używanych w widokach i częściach:

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

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

wynik:

1
2
1
Grzegorz
źródło
2
To dobra uwaga, nie myślałem o zmienności zmiennych. Miałem założenie, że kontroler „prezentuje” zmienne do widoków, ale zmienne instancji mogą zdecydowanie wprowadzać błędy, jeśli zostaną zmodyfikowane.
Amala