2014-02-28 22 views
0

我從Michael Hartl的教程學習Rails,但是我對SessionsHelper模塊感到非常困惑。沒有提供有關current_user方法重複的足夠信息。有人可以解釋爲什麼有兩個,他們的目的是什麼?關於SessionsHelper的混淆,特別是current_user方法?

module SessionsHelper 

    def sign_in(user) 
    cookies.permanent[:remember_token] = user.remember_token 
    self.current_user = user 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

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

end 

我明白sign_in方法將觸發調用current_user=(user)但爲什麼再次current_user方法?我明白第二種方法從數據庫獲取基於remember_token的用戶,但我無法連接關於這些的點。

回答

2

current_userreader方法和current_user=writer方法爲您的屬性current_user。這兩個是獨立的方法,一個用於讀取值,另一個用於寫入current_user的值。

EDIT

在你的情況,即current_user=設置實例的可變@current_user等於傳遞的值(用戶)的值的方法的裝置。

def current_user=(user) 
    @current_user = user 
end 

current_user方法意味着,

def current_user 
    ## if @current_user = nil then 
    ## set @current_user = User.find_by_remember_token(cookies[:remember_token]) 
    ## else return @current_user 

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

sign_in方法,

def sign_in(user) 
    cookies.permanent[:remember_token] = user.remember_token 
    self.current_user = user 
end 

sign_in方法將被稱爲sign_in user從控制器。

像亞倫在評論中提到,沒有self,紅寶石將簡單地創建一個名爲current_user局部變量,它會失去一次sign_in方法執行完畢。

但是通過說,self.current_user = user current_user的值將保存在類的當前實例(您已經包含該模塊的控制器的實例)中。

爲了更好地理解self參閱本Stackoverflow question on self

+0

所以CURRENT_USER方法僅返回@current_user變量這就是從DB拉?你也可以解釋一下sign_in方法中的自我方法是什麼?我認爲自我只在模型中用來指代從數據庫中提取的記錄。 –

+2

'self.'告訴ruby在類的實例上使用'current_user ='方法,而不是創建一個名爲'current_user'的新局部變量,並將'user'賦給它只是爲了讓它超出範圍。 – Aaron

+0

@Aaron好解釋:) +1。 –