在Rails的会话中查找当前用户

问题描述

enter image description here

朋友们在这里帮助我; 查看上面的屏幕快照中的current_user方法,当用户首次登录时,实例变量@current_user将被分配User对象。但是,当发出后续请求时,将测试会话中user_id的存在,如果找到,则如果先前分配了@current_user,则返回@current_user,否则进行分配并返回。我的问题是:如果使用@current_user的先前分配来确定登录状态,我们如何知道新请求中的用户与先前分配给@current_user的用户相同? 感谢您的贡献。

解决方法

您在这里犯了一个基本的逻辑错误。

控制器实例变量仅存在于单个请求的范围内。当请求到达您的Rails应用程序时,它将请求与您的路线进行匹配。这些路由给出了控制器/动作的组合,Rails使用此信息来实例化控制器类的新实例并在其上调用正确的方法。

此代码实际上不会以任何方式在请求中保留任何

def current_user
  @current_user ||= User.find_by(id: session[:user_id])
end

相反,它使用条件分配来防止在同一请求 中重复运行User.find_by(从而查询数据库)。

这是一种称为记忆的技术。

session另一方面在请求之间仍然存在,因为它存储在Cookie中,并在客户端和服务器之间来回传递。