2013-04-02 9 views
10

Samouczek, który obserwuję, znajduje się w podkatalogu app/helpers w poniższym module SessionsHelper, który jest używany przez wiele kontrolerów i widoków. Ale gdzie jest przechowywana instancja zmiennej current_user podczas jej tworzenia? Jaka jest klasa obiektu, w którym jest przechowywany?Gdzie przechowywane są zmienne instancji w module pomocniczym Rails?

Po pierwszym wywołaniu kontrolera metoda current_user tworzy zmienną instancji current_user. Kiedy widok wywołuje metodę current_user w jaki sposób jest już obecna zmienna instancji current_user? Czy podczas renderowania widoku jest ustawiony obiekt kontrolera na self?

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

Myślę, że możesz kliknąć ten link: http://stackoverflow.com/questions/5575188/rails-tutorial-9-3-3-current-user – Shrikant1712

+1

twoje pytanie jest dobre - w rzeczywistości jest dużo (niektórzy twierdzą, że niepotrzebne)) magia podczas renderowania. Nie znam szczegółowo tego procesu, ale pamiętałem, że przeczytałem gdzieś, że kontekst widoku skopiował wiele rzeczy ze sterownika, w tym zmienne instancji. Myślę, ale nie jestem pewien, że kontekst widoku deleguje również każdą metodę, której nie zna kontroler. To wymaga bardziej dogłębnych badań ... Myślę, że spędzę trochę czasu przeglądając źródło railsów, i powinieneś zrobić to samo: D –

Odpowiedz

2

Odpowiedź ta mówi o tym, jak w ogóle zmienne instancji są przekazywane między kontrolerem a widzenia: How are Rails instance variables passed to views?

Więc w zasadzie, jeśli @current_user jest ustawiony przez kontrolera, to zmiennej instancji (wraz z wszystkimi innymi) będzie zostać przeniesione z kontekstu kontrolera do kontekstu widoku. Jeśli nie został ustawiony przez kontroler, zostanie ustawiony po raz pierwszy, gdy widok go używa.

Aby uzyskać więcej informacji, zobacz drugą odpowiedź. To jest dobra lektura.

wklejony z odpowiedzią @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 

przekazaniem ich do widzenia (github):

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

ustawiając je w widoku (github):

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

A więc podczas rozmowy pomocnika wewnątrz widoku, self jest "view_context_class"? Jakiego rodzaju jest to w rzeczywistości? Dzięki. – lulalala

+1

Jest to 'ActionView :: Base' i domyślam się: https://github.com/rails/rails/blob/0c5552a3dd28e35cce64462765cc41c5355db0f1/actionpack/lib/abstract_controller/rendering.rb#L49-L67 –

+0

Pomocnik to moduł, który, będąc podobnym do klasy, nie jest podobny do obiektu. Różnica polega na tym, że moduł jest mieszany tam, gdzie jest zawarty. Mówiąc prościej, jest to odpowiednik kopiowania wklejania kodu modułu. Więc, ponieważ kod pomocnika jest wklejony do widoku, self jest view_context_class – Houen

Powiązane problemy