Ruby on Rails中的会话误解

时间:2013-08-27 11:13:54

标签: ruby-on-rails ruby session

我在rails下工作,作为初学者,我试图了解会话功能的工作原理。 我把我的会话置于活动记录之下,但当我这样做时:

    @request = Facebook::Request.parse_signed_request(params[:signed_request],
    Settings.facebook.app_secret) 
    puts session
    @admin = Admin.find_by_fb_userid(@request["user_id"])
    session[@request["user_id"]] = @admin ? @admin : nil

我的会话继续显示:

{}

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

会话如何运作?

HTTP是无状态协议。这意味着它将每个请求视为独立事务 与之前的任何请求无关,因此通信由独立组成 请求和响应对。

无状态协议不要求服务器保留会话 在多个请求期间,每个通信伙伴的信息或状态。

协议不提供在请求之间存储用户数据的方法。

因此,我们使用Sessions,这样我们就可以多个请求组合在一起成为客户端和服务器之间的对话,因此暂时保留data

Sessionhash,因此您可以将数据添加到会话中,就像常规哈希一样:

例如,要在会话中添加新订单,可以如下所示:

e.g。 OrdersController

def new
@order = current_user.orders.create   # creates a new order for current_user
session[:order] = @order.to_params    # adds order information to the session.
end

会话可以存储任何类型的string数据,但最好通过将其作为第三方用户的速度安全性保持尽可能小来实现最佳服务可以轻松解码会话中存储的信息。

更新

默认情况下session data存储为cookies,但Rails允许使用session storage或使用ActiveRecordStore的内存存储在数据库中配置Redis Redis store。每种方法都有其优点和缺点。

答案 1 :(得分:1)

尝试打印会话值而不是整个会话对象:

puts session[@request['user_id']]

在设置会话之前和之后执行此操作。并确保在浏览器中测试之前清理会话(清除cookie或开始隐身会话)。

最后但并非最不重要的是,将整个对象存储在会话中是一个坏主意。这样,您在会话中存储的数据超出了所需的数量。尝试仅存储对象ID(在您的情况下为@admin.id),然后在需要时加载它。

答案 2 :(得分:0)

好吧,我的错是我正在开发一个facebook应用程序,我想每次刷新,会话都会被同行重置。

但是当我继续我的过程时,一切都立即奏效。

即使会话是无状态协议,也会通过用于在整个会话期间保持会话活动的存储来使用它。

与PHP或每种语言一样