13 votes

Où sont stockées les variables d'instance dans un module d'aide Rails ?

Un tutoriel que je suis a dans le sous-répertoire app/helpers le module SessionsHelper ci-dessous qui est utilisé par de nombreux contrôleurs et vues. Mais où se trouve la variable d'instance current_user stockée lors de sa création ? Quelle est la classe de l'objet où il est stocké ?

Lorsqu'un contrôleur invoque pour la première fois la fonction current_user méthode le current_user est créée. Lorsqu'une vue invoque ensuite la fonction current_user comment se fait-il qu'un current_user La variable d'instance est déjà présente ? Est-ce que self défini à l'objet contrôleur pendant le rendu de la vue ?

module SessionsHelper
  ...
  def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end
  ...
end

4voto

Houen Points 107

Cette réponse explique en général comment les variables d'instance sont transmises entre le contrôleur et la vue : Comment les variables d'instance Rails sont-elles transmises aux vues ?

En gros, si @current_user est défini par un contrôleur, cette variable d'instance (ainsi que toutes les autres) sera transmise du contexte du contrôleur au contexte de la vue. Si elle n'a pas été définie par un contrôleur, elle sera définie la première fois qu'une vue l'utilisera.

Pour plus d'informations, voir l'autre réponse. C'est une bonne lecture.

Collé de la réponse de @mechanicalfish :

def view_assigns
  hash = {}
  variables  = instance_variables
  variables -= protected_instance_variables
  variables -= DEFAULT_PROTECTED_INSTANCE_VARIABLES
  variables.each { |name| hash[name[1..-1]] = instance_variable_get(name) }
  hash
end

Les passer à la vue (github) :

def view_context
  view_context_class.new(view_renderer, view_assigns, self)
end

Les définir dans la vue (github) :

def assign(new_assigns) # :nodoc:
  @_assigns = new_assigns.each { |key, value| instance_variable_set("@#{key}", value) }
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X