会话是Rails中的方法还是哈希?有点困惑

时间:2015-10-23 01:10:09

标签: ruby-on-rails ruby session

有一个非常简单的问题。我正在做Michael Hartl的轨道教程,它谈到了使用会话方法:

在Rails定义的会话方法的帮助下,记录用户很简单...我们可以将会话看作是一个哈希,并按如下方式分配给它:

session[:user_id] = user.id

它说你可以将会话看作是一个哈希,但我很困惑,因为它被称为会话方法,所以实际上被调用的是什么?我的猜测是,通过插入会话哈希,有一个会话函数,查看哈希,看看是否有任何存在?我不确定它是如何工作的。

2 个答案:

答案 0 :(得分:2)

这是一个方法,它返回一个对象,该对象支持Hash对象支持(某些)相同的方法,例如[][]=。实际上,它是一个ActionDispatch::Request::Session对象。

答案 1 :(得分:2)

如果不提Session documentation

,那将是粗鲁的
  

所有会话商店使用cookie来存储每个会话的唯一ID (您必须使用cookie,Rails不允许您在URL中传递会话ID,因为这不太安全)

基本上,每次有人访问您的Rails应用时,它都会在浏览器中创建一个小Cookie,可通过唯一ID(用户ID)识别。

这个cookie本质上是一个Ruby哈希,因此你可以在其中存储散列数据:

session[:your_hash] = "TEST"

这将允许您通过请求存储小的数据片段(例如user_id或其他)。

Rails的主要原因是HTTPstateless protocol

无状态协议与有状态协议相反;它们不保留请求之间的状态,因此每次访问应用程序的新实例时都必须重新调用数据等。

简单地说,这转化为Rails是一个“愚蠢”的系统 - 只记住你在每次请求时发送的数据。开发人员几十年来一直使用Session variables来提供有关用户/偏好等的基本信息,允许您在每次请求时“重建”用户。

这就是您必须将user_id保存为会话的原因 - 每次您希望引用登录用户的数据时,必须根据存储在会话哈希中的id构建它