有一个非常简单的问题。我正在做Michael Hartl的轨道教程,它谈到了使用会话方法:
在Rails定义的会话方法的帮助下,记录用户很简单...我们可以将会话看作是一个哈希,并按如下方式分配给它:
session[:user_id] = user.id
它说你可以将会话看作是一个哈希,但我很困惑,因为它被称为会话方法,所以实际上被调用的是什么?我的猜测是,通过插入会话哈希,有一个会话函数,查看哈希,看看是否有任何存在?我不确定它是如何工作的。
答案 0 :(得分:2)
这是一个方法,它返回一个对象,该对象支持Hash
对象支持(某些)相同的方法,例如[]
和[]=
。实际上,它是一个ActionDispatch::Request::Session
对象。
答案 1 :(得分:2)
所有会话商店使用cookie来存储每个会话的唯一ID (您必须使用cookie,Rails不允许您在URL中传递会话ID,因为这不太安全)
基本上,每次有人访问您的Rails应用时,它都会在浏览器中创建一个小Cookie,可通过唯一ID(不用户ID)识别。
这个cookie本质上是一个Ruby哈希,因此你可以在其中存储散列数据:
session[:your_hash] = "TEST"
这将允许您通过请求存储小的数据片段(例如user_id
或其他)。
Rails的主要原因是HTTP
为stateless protocol。
无状态协议与有状态协议相反;它们不保留请求之间的状态,因此每次访问应用程序的新实例时都必须重新调用数据等。
简单地说,这转化为Rails是一个“愚蠢”的系统 - 只记住你在每次请求时发送的数据。开发人员几十年来一直使用Session variables来提供有关用户/偏好等的基本信息,允许您在每次请求时“重建”用户。
这就是您必须将user_id
保存为会话的原因 - 每次您希望引用登录用户的数据时,必须根据存储在会话哈希中的id
构建它