2013-04-02 79 views
10

我正在遵循的教程在子目錄app/helpers中有許多控制器和視圖使用的SessionsHelper模塊。但實例變量current_user在第一次創建時存儲在哪裏?它存儲的對象的類是什麼?Rails助手模塊中的實例變量存儲在哪裏?

當控制器首次調用current_user方法時,將創建current_user實例變量。當一個視圖然後調用current_user方法時,它是如何存在一個current_user實例變量的?在渲染視圖期間是否將self設置爲控制器對象?

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

我想你可以按照這個鏈接 http://stackoverflow.com/questions/5575188/rails-tutorial-9-3-3-current-user – Shrikant1712

+1

你的問題是一個很好的 - 事實上,有很多(有人會說_unnecessary_ )渲染期間的魔法。我不清楚這個過程的細節,但我記得在某處看到視圖上下文從控制器複製了很多東西,包括實例變量。我想,但我不確定,視圖上下文還委託任何它不知道的方法給控制器。這需要更徹底的研究......我想我會花一些時間瀏覽rails的源代碼,你應該這樣做:D –

回答

2

這個答案告訴一般在實例變量是如何控制器和視圖之間傳遞:How are Rails instance variables passed to views?

所以基本上,如果@current_user由控制器,該實例變量(以及其他所有)將設置從您的控制器上下文傳遞到視圖上下文。如果它沒有被控制器設置,它將在視圖首次使用時設置。

欲瞭解更多信息,請參閱其他答案。這是一個很好的閱讀。

從@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 

它們傳遞給視圖(github上):

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

在視圖中設置這些(github上):

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

因此,在視圖內的助手調用期間,self是'view_context_class'?它實際上是什麼類?謝謝。 – lulalala

+1

它的一個'ActionView :: Base'我猜:https://github.com/rails/rails/blob/0c5552a3dd28e35cce64462765cc41c5355db0f1/actionpack/lib/abstract_controller/rendering.rb#L49-L67 –

+0

輔助工具是一個模塊,而類似於一個類,與一個對象不相似。不同之處在於,模塊在其包含的位置混合。簡單來說,這相當於複製粘貼模塊代碼。因此,由於輔助代碼粘貼到視圖中,self是view_context_class – Houen