2013-02-28 72 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