2013-04-02 13 views
10

Ein Tutorial, das ich befolge, hat im Unterverzeichnis app/helpers das folgende SessionsHelper-Modul, das von vielen Controllern und Views verwendet wird. Aber wo wird die Instanzvariable current_user gespeichert, wenn sie zum ersten Mal erstellt wird? Was ist die Klasse des Objekts, in dem es gespeichert ist? Wenn ein Controller zuerst die current_user-Methode aufruft, wird die current_user Instanzvariable erstellt. Wenn eine Ansicht dann die current_user Methode aufruft, wie ist es dann, dass eine current_user Instanzvariable bereits vorhanden ist? Ist self beim Rendern der Ansicht auf das Controller-Objekt gesetzt?Wo sind Instanzvariablen in einem Rails-Helper-Modul gespeichert?

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

Ich denke, dass Sie diesem Linkfolgen können http://stackoverflow.com/questions/5575188/rails-tutorial-9-3-3-current-user – Shrikant1712

+1

Ihre Frage ist eine gute - in der Tat gibt es eine Menge (einige würden sagen _unnötig_) Magie beim Rendern. Ich kenne den Prozess nicht im Detail, aber ich erinnerte mich, irgendwo gelesen zu haben, dass der Ansichtskontext eine Menge Dinge vom Controller kopiert hat, einschließlich der Instanzvariablen. Ich denke, aber ich bin mir nicht sicher, ob der View-Kontext auch jede Methode, die er nicht kennt, an den Controller delegiert. Dies benötigt eine gründlichere Recherche ... Ich denke, ich werde einige Zeit damit verbringen, durch die Quelle von Rails zu gleiten, und Sie sollten dasselbe tun: D –

Antwort

2

Diese Antwort sagt im Allgemeinen, wie Instanzvariablen zwischen Controller und Ansicht übergeben: How are Rails instance variables passed to views?

Also im Grunde, wenn @current_user durch einen Regler eingestellt, dass Instanzvariable (zusammen mit allen anderen) wird von Ihrem Controller-Kontext an den View-Kontext übergeben werden. Wenn es nicht von einem Controller festgelegt wurde, wird es beim erstmaligen Verwenden einer Ansicht festgelegt.

Weitere Informationen finden Sie in der anderen Antwort. Es ist eine gute Lektüre.

von @mechanicalfish Antwort Pasted:

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 

sie zu der Ansicht (Github) Passing:

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

sie in der Ansicht (Github) Rahmen:

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

Also ist während des Aufrufs von Helfern in einer Ansicht self eine 'view_context_class'? Was für eine Klasse ist das eigentlich? Vielen Dank. – lulalala

+1

Es ist ein "ActionView :: Base" ich denke: https://github.com/rails/rails/blob/0c5552a3dd28e35cce64462765cc41c5355db0f1/actionpack/lib/abstract_controller/rendering.rb#L49-L67 –

+0

Ein Helfer ist ein Modul, das, während sie einer Klasse ähnlich sind, ist sie einem Objekt nicht ähnlich. Der Unterschied besteht darin, dass ein Modul dort eingefügt wird, wo es enthalten ist. Um es ein bisschen einfach zu sagen, dies ist das Äquivalent zum Kopieren-Einfügen des Modul-Codes in. So, da der Helfer-Code in die Ansicht eingefügt wird, ist self eine View_Context_Class – Houen

Verwandte Themen