2013-02-28 69 views
0

如果您觀看任何與Ryan Bates身份驗證相關的Railscast,則在創建簽名/簽出功能時會看到反覆出現的主題,並且我想更清楚地理解一點。在Rails中登錄會話助手

def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
end 
helper_method :current_user 

例如通常在會話控制器的創建操作將包含一個分配給會話散列如session[:user_id] = user.id鑑於變量用戶被設置爲一個有效記錄的對象。

然後在整個視圖中使用上述幫手方法來查找當前登錄的用戶。

但是註銷時,銷燬行動中只包含session[:user_id] = nil

是不會@current_user還需要我的問題設置爲零,因爲它會被設置爲在簽署之前的用戶線?

回答

1

通常在設置session[:user_id] = nil之後你的控制器會返回所以@current_user仍然活動無所謂。您必須記住@current_user只存在於該請求中,下一個請求通過該控制器類的新實例。

你是對的,如果你做了這樣的事情:

def destroy 
    session[:user_id] = nil 
    logger.debug current_user.inspect # Current user is still set for this request 
    redirect_to admin_url, notice => "You've successfully logged out." 
end 

你會看到在日誌文件中的用戶信息,但通常你正在清理會議之後做了重定向[:USER_ID]所以該控制器實例已完成。

+0

K謝謝!說得通。因此,只要頁面在下一個請求中重定向,就會再次載入「@ current_user」,而不是包含之前簽名用戶的user_id,而本質上是'@current_user = nil || User.find(session [:user_id])if session [:user_id]?' – rssathe 2013-02-28 23:58:36