0

如果您观看任何与 Ryan Bates 身份验证相关的 Railscast,您会在创建 sigin/signout 功能时看到一个反复出现的主题,我想更清楚地理解这一点。

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

例如,通常在会话控制器中,创建操作将包含对会话哈希的分配,例如session[:user_id] = user.id假设变量 user 设置为 Active Record 对象。

然后在整个视图中使用上述辅助方法来查找当前登录的用户。

但是,当退出销毁操作时,仅包含该行session[:user_id] = nil

我的问题是也不@current_user需要设置为零,因为它将设置为以前登录的用户?

4

1 回答 1

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

您会在日志文件中看到用户信息,但通常您会在清除 session[:user_id] 后立即进行重定向,以便控制器实例完成。

于 2013-02-28T20:45:48.017 回答