2013-04-02 3 views
10

Un tutorial che sto seguendo ha nella sottodirectory app/helpers il seguente modulo SessionsHelper utilizzato da molti controller e viste. Ma dov'è la variabile di istanza current_user memorizzata quando viene creata per la prima volta? Qual è la classe dell'oggetto in cui è memorizzata?Dove sono memorizzate le variabili di istanza in un modulo helper di Rails?

Quando un controller invoca per la prima volta il metodo current_user, viene creata la variabile di istanza current_user. Quando una vista richiama quindi il metodo current_user come è già presente una variabile di istanza current_user? self impostato sull'oggetto controller durante il rendering della vista?

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

penso che tu possa seguire questo link http://stackoverflow.com/questions/5575188/rails-tutorial-9-3-3-current-user – Shrikant1712

+1

la tua domanda è buona - in effetti, ce ne sono molte (qualcuno direbbe _unnecessary_) magia durante il rendering. Non conosco il processo in dettaglio, ma mi sono ricordato di aver letto da qualche parte che il contesto della vista copiò molte cose dal controller, incluse le variabili di istanza. Penso, ma non sono sicuro, che il contesto vista deleghi anche qualsiasi metodo che non conosce al controller. Ciò richiede una ricerca più approfondita ... Penso che passerò un po 'di tempo sfogliando la fonte dei binari, e dovresti fare lo stesso: D –

risposta

2

Questa risposta dice, in generale, su come le variabili di istanza sono passati tra il controller e view: How are Rails instance variables passed to views?

Quindi, fondamentalmente, se @current_user è impostato da un controllore, che variabile di istanza (insieme a tutti gli altri) saranno essere passati dal contesto del controller al contesto della vista. Se non è stato impostato da un controller, verrà impostato la prima volta che viene utilizzato da una vista.

Per ulteriori informazioni, vedere l'altra risposta. È una buona lettura

incollato dalla risposta @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 

loro Passando alla vista (GitHub):

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

loro impostazione nella vista (GitHub):

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

Quindi durante la chiamata di aiuto all'interno di una vista, self è un 'view_context_class'? Che tipo di classe è in realtà? Grazie. – lulalala

+1

È un 'ActionView :: Base' che indovina: https://github.com/rails/rails/blob/0c5552a3dd28e35cce64462765cc41c5355db0f1/actionpack/lib/abstract_controller/rendering.rb#L49-L67 –

+0

Un helper è un modulo, che, pur essendo simile a una classe, non è simile a un oggetto. La differenza è che un modulo è mescolato nel punto in cui è incluso. Per dirla semplicemente, questo è l'equivalente del copia-incolla del codice del modulo. Quindi, dal momento che il codice dell'helper è incollato nella vista, self è una view_context_class – Houen