问题描述
朋友们在这里帮助我; 查看上面的屏幕快照中的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中,并在客户端和服务器之间来回传递。