Pourquoi les gens suggèrent de ne pas utiliser la variable d'instance pour les vues dans Ruby on Rails

12

Pourquoi est-ce que j'entends qu'il n'est pas bon de partager des variables d'instance entre les contrôleurs et les vues. Je l'aime un peu parce que je peux voir immédiatement via le @ que quelque chose vient du contrôleur. Je vois une belle façon d'utiliser des assistants dans les contrôleurs ici: http://www.stephencelis.com/2008/09/06/rails-controllers-views-and-variables.html . Mais j'utilise cancan pour cette portion.

Amala
la source

Réponses:

11

L'idée a été mise en place dans les meilleures pratiques de rails: remplacer la variable d'instance par la variable locale

Fondamentalement, si vous n'utilisez pas de nombreux partiels ou si vous avez une seule vue simple pour chaque méthode de contrôleur, l'utilisation des variables d'instance dans la vue ne causerait pas vraiment de problème.

Néanmoins, si vous utilisez de nombreux partiels et avez donc de nombreuses variables d'instance déclarées dans votre contrôleur ..., il pourrait être moins déroutant si vous utilisez l'alternative de passer explicitement la variable contrôleur (instance) aux partiels. De cette façon - tout en travaillant dans la VUE partielle - vous avez une référence explicite à la variable / à l'objet avec lequel vous souhaitez travailler qui n'est pas partagée avec 'tous' les partiels qui sont inclus dans la création de la page.

Après tout, vous pouvez gérer cela comme vous le souhaitez, personne ne vous dira de le faire autrement. Mon opinion personnelle, cependant, est que j'aime l'idée d'avoir des références explicites dans mes partiels / vues qui ne peuvent pas être confondues avec d'autres variables.

Ingo
la source
5

Vous pouvez obtenir l'analogie à partir de globalvariables ou de variables passées par référence, et considérer les partiels comme des fonctions. Donc, utiliser une variable d'instance est à peu près comme une variable passée à fonctionner comme référence avec tous ses avantages et ses inconvénients:

# controller 
def index
  @var = 1
end

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

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

le résultat sera

1
2
2

Vous voudrez peut-être un tel comportement, mais dans la plupart des cas, vous n'en aurez pas besoin. Et il est plus facile d'introduire des bogues de cette façon et plus difficile de les suivre. C'est pourquoi cela est recommandé, car il sépare les portées des variables utilisées dans les vues et les partiels:

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

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

résultat:

1
2
1
Grzegorz
la source
2
C'est un bon point, je n'ai pas pensé à la mutabilité des variables. J'ai supposé que le contrôleur "présentait" les variables aux vues, mais les variables d'instance peuvent certainement introduire des bogues si elles sont modifiées.
Amala