我正在關注 Michael Hartl 的 Rails 教程。我對會話助手模塊的一部分感到困惑。
在下面的代碼中,有人可以澄清方法中的 current_userin 是否logged_in?指的是實際方法,current_user并且在用戶僅登錄時讀取?如果方法current_user死了不回傳零?
或者
是current_user指方法@current_user 內部的實體變數嗎current_user
非常感謝任何澄清。太感謝了!
module SessionsHelper
# Logs in the given user.
def log_in(user)
session[:user_id] = user.id
end
# Returns the current logged-in user (if any).
def current_user
if session[:user_id]
@current_user ||= User.find_by(id: session[:user_id])
end
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
end
uj5u.com熱心網友回復:
您放入app/helpers目錄中的每個模塊都包含在您的控制器中。當你包含一個模塊時,你將它添加到類的祖先鏈中,這樣它的行為就好像該方法是在類本身中定義的。
因此,為了current_user逐行解釋該方法,它會檢查會話是否具有密鑰:user_id,然后將實體變數分配@current_user給控制器(如果尚未設定)。這被稱為記憶 getter 方法 - 并避免每次呼叫時觸發資料庫查詢以獲取用戶。
在logged_id?您使用該 getter 方法時:
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
它實際上可以寫為!@current_user.nil?. 但是有一個很大的警告 - 在 Ruby 中,您可以參考未設定的實體變數而不會出錯。因此,如果您打錯字并撰寫!@curent_user.nil?它,它會意外地失敗,因為它始終為零。
在創建身份驗證系統時,也應該只有一種方法知道如何獲取用戶,所有其他代碼都應該通過該系統,這樣實作細節就不會到處泄露。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/384607.html
