大家好!最近,我正在研究Michael Hartle的RoR教程。在第八章中,我遇到了一個讓我困惑了兩天的問題。這是問題。在8.2.3節。Ruby On Rails教程第8章混亂
module SessionsHelper
def sign_in(user)
.
.
.
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user # Useless! Don't use this line.
end
end
邁克爾寫道:
如果我們這樣做,我們將有效地複製 attr_accessor,這是我們在第4.4.5.5的問題看到的功能是,它完全 未能解決我們的問題是:使用代碼清單8.21中的代碼, 用戶的登錄狀態將被遺忘:只要用戶去 另一個頁面 - poof! - 會話將結束,用戶將自動登出 。爲了避免這個問題,我們可以找到與代碼 8.19中的代碼創建的記憶標記對應的用戶 ,如代碼清單8.22所示。
上市8.22。
module SessionsHelper
.
.
.
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
end
我的問題是:爲什麼以前的代碼會使會話在用戶轉到新頁面時自動註銷?爲什麼第二塊代碼不會?我認爲,只要用戶登錄,@ current_user的值將始終爲「用戶」,直到他明確註銷爲止,對吧?
謝謝!現在,我的理解是:在佈局中,如果我們需要「current_user」的值,將調用'current_user'方法。因此我們使用'@current_user || = User.find_by_remember_token(cookies [:remember_token])'而不是'@current_user = User.find_by_remember_token(cookies [:remember_token])'來提高調用current_user方法的速度。對? – Liwen
|| =在分配之前檢查@current_user是否有值。|| =是或等於運算符,相當於說「@current_user = @current_user ||」 User.find_by_remember_token(餅乾[:remember_token])'。這是一種檢查變量是否有值的方法,如果沒有,則賦值。這在Ruby的世界中是非常標準的,所以你最好熟悉它。 :) –