1

我在 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

我的会话继续显示:

{}

谢谢你的帮助 !

4

3 回答 3

2

会话如何工作?

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

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

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

因此,我们Sessions使用.data

Session是 a hash,因此您可以像常规哈希一样将数据添加到会话中:

例如,向会话中添加新订单可能如下所示:

例如订单控制器

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存储为,cookiesRails 允许session storage在数据库中使用和ActiveRecordStore或 inmemory 存储进行配置。每种方法都有其优点和缺点。RedisRedis store

于 2013-08-27T11:47:11.380 回答
1

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

puts session[@request['user_id']]

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

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

于 2013-08-27T11:37:21.010 回答
0

好吧,我的错是我猜我正在开发一个 Facebook 应用程序,每次刷新,会话都会被对等方重置。

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

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

就像在 PHP 或每一种语言中一样

于 2013-08-27T13:22:15.277 回答