2011-03-21 67 views
0

我目前通過http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec:current_use r] 1工作,我很難理解兩個current_user方法之間的區別。在我的另一個方法sign_in中有一個調用self.current_user但我無法理解哪個current_user被調用,以及其他current_user方法實際上在做什麼。幫助紅寶石的方法同名

module SessionsHelper 
    def sign_in(user) 
    cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
    self.current_user = user 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user 
    @current_user ||= user_from_remember_token 
    end 

    def signed_in? 
    !current_user.nil? 
    end 

    private 
    def user_from_remember_token 
     # using the * makes us pass two values [id,salt] 
     User.authenticate_with_salt(*remember_token) 
    end 

    def remember_token 
     cookies.signed[:remember_token] || [nil,nil] 
    end 
end 

回答

1

當您分配給對象的屬性CURRENT_USER的current_user=方法被調用,當你這樣做不是current_user方法被調用。

所以self.current_user = user調用current_user=!current_user.nil?調用current_user

+0

如果我只是調用''current_user.nil?'',我甚至會需要'current_user ='方法嗎?因爲'current_user'方法沒有檢索用戶,或者只是將'@ current_user'設置爲零。 – Kevin 2011-03-21 04:56:42

+0

@Kevin:如果將sign_in修改爲分配給@current_user,那麼您可以在該代碼中刪除current_user =方法。但是如果你想創建「模仿」用戶的能力,你會發現current_user =很有用 - 你是以你身份登錄的,但假裝是別人。 (此功能可以幫助調試客戶支持問題。) – btilly 2011-03-21 05:17:24

0

區別在於current_user=實現了相等的運算符。所以當你做current_user = something時,它真的叫current_user=(something)

而不是current_user,這只是一個'吸氣'。

我在Ruby訪問器上閱讀this article

0

這是分配方法。

使用像以下的方法

obj.current_user= some_user_object呼叫。

def current_user=(user) 
    @current_user = user 
    end 

以下方法返回對象當前用戶。如果@current_user爲空,它將分配用戶對象並返回它。

some_user=obj.current_user調用以下方法。

def current_user 
    @current_user ||= user_from_remember_token 
    end