3

我正在通過偉大的Michael Hartl教程來構建ruby應用程序here在Ruby中創建登錄會話時瞭解「current_user」概念

我想了解如何創建一個會話的概念,我被困在瞭解這一行:

self.current_user = user 

在這個方法:

module SessionsHelper 

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

我明白的整個概念用user_token創建一個cookie。

但我不明白是什麼呢self.current_user = user手段,爲什麼它甚至有必要保留此行的代碼 - 我與令牌的Cookie - 爲什麼我需要知道當前用戶?

此外,這個「自我」存儲在哪裏 - 它不像我在我的一個視圖中可以看到的flash[:success]參數。所以我不明白它在哪裏。

也有這2種方法在同一模塊中:

def current_user=(user) 
    @current_user = user 
    end 

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

而且還是我想的目的,連點這個神祕current user - 是它的目的是爲了創造@current_user全局變量使用在意見?

如果是這樣的 - 爲什麼有這些有2個功能重複def current_user=(user)def current_user

+1

'self'是一個Ruby關鍵字,允許對象引用自身。因此,'self.current_user = user'正在調用模塊的'current_user =(user)'方法,該方法將參數'user'分配給變量'@ current_user'。在你看來,當你調用'current_user'時,你正在調用'current_user'方法,它返回'@ current_user'變量。希望有所幫助。 – 2012-08-15 13:43:12

+0

哦,我剛剛注意到Harti的輔導說的或多或少都是我在我的答案中寫的相同的東西......嗯。你不明白他寫的是什麼嗎?這不是明顯的東西,需要一段時間才能沉入水中(在寫回答時不得不多次複查自己)。 – 2012-08-15 13:49:09

+0

就像Tom L說的那樣,self允許一個對象引用自己,並且所有東西都是Ruby中的一個對象。所以'自我'可以指很多東西,比如類的一個實例(當在一個實例方法中時,就像在你的例子中那樣),類本身(當在類內但是在外部方法中定義時,比如def self.method), etc. – maru 2012-08-15 13:49:20

回答

4

有幾件事情。首先,你正在閱讀的方法名稱錯誤(這並不奇怪給出瞭如何隱藏的ruby方法命名)。 def current_user=(user)實際上被讀爲定義採用參數user的方法current_user=,而def current_user定義了不採用參數的方法current_user。這些分別被稱爲settergetters

這裏是一個參考:Ruby (programming language): What are setters and getters in Ruby?

這樣解釋的重複。談談你的下一個問題。

我不明白這是什麼self.current_user =用戶意味着

self本身就是一個話題,對得起自己的討論,所以我甚至不會試圖解釋它(這裏的one reference)。出於這個問題的目的,要記住,爲了設置實例變量,你需要在self的前面賦值,即使在類中(爲了其他目的,它也是隱含的)。該行的其餘部分是對上述我提到的current_user= setter方法的調用,參數user

爲什麼它甚至有必要保持這一行代碼 - 我有cookie的令牌 - 爲什麼我需要知道當前用戶?

必要的原因是,您不希望每次需要獲取當前用戶時都從令牌中查找用戶。看看getter方法:

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

它說的是:如果我沒有擡頭,並設置實例變量@current_user尚未,然後看看它;如果我已經設置好了,那麼就返回它。這節省了很多查找。

我認爲這可以回答你的問題。有很多更深層次的問題(self等),您可以在其他位置找到更多信息。這就是爲什麼你需要包括self的制定者對SO一個討論:Why do Ruby setters need "self." qualification within the class?

UPDATE:小的澄清,有關使用self的制定者的類內的最後一個環節,實際上是有點離題,因爲你叫它在一個模塊中,而不是直接來自一個類。在模塊的情況下,self.current_user = user中的self將成爲該模塊包含在其中的類,例如, User.current_user如果它被稱爲類User等內再次,你們自己討論的另一個話題...

+0

非常感謝你的回覆。我花時間回顧你所解釋的問題。我理解了制定者和獲得者的整個概念。我仍然需要更好地把握「自我」。問題 - 但這將在一個新的線程:) – Alon 2012-08-17 11:42:08

+0

很高興它對你有意義! 「自我」可以是一種令人撓心的,我仍然在學習它的細微差別。 – 2012-08-17 12:13:47

1

方法def current_user=(user)基本上是在sign_in方法,以設定CURRENT_USER使用二傳手。

def current_user將返回@current_user,或者如果未設置,它將通過remember_token在Users表中找到它。這基本上允許你在任何時間點獲得current_user。

self.current_user在sign_in方法的上下文中將引用此例中的調用類或模塊。它將從Session Helper模塊呼叫current_user