带有ActiveRecord会话和Restful-authentication的Rails:会话表何时被写入?

时间:2009-05-25 04:17:36

标签: ruby-on-rails session restful-authentication

警告:其中一些可能非常错误,所以如果我的假设不正确,请告诉我。

这就是我想要完成的事情:

我正在使用restful-authentication进行登录。但是,当我在我的UI中使用flex / ruby​​_amf时,我必须单独验证flex的每个连接。

我决定这样做的方法是将登录屏幕重定向到嵌入式Flash页面,将session-id作为flashvar插入。 Flash应用程序会在每次请求时发送session-id,并且所有相关控制器上的before filter都会检查与session-id标识的会话关联的用户是否已登录。

我将用户与会话相关联的方法是在sessions表中添加'user_id'列,然后执行sql“update sessions set user_id ...”从登录函数调用的类型查询。

但是,user_id仅在用户登录时第二次更新。稍微调查显示在执行登录功能期间会话表中的记录尚不存在。

所以,如果到目前为止所做的一切都有意义,并且符合最佳实践等,那么我的问题是:

会话表中的记录在什么时间点创建?有没有办法在登录功能中更新会话对象,并让rails将user_id写入数据库?

rails中会话的行为对我来说真是一个谜。我很感激任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:1)

在Rails 2.3中,会话在Rack应用程序完成处理后保存。在传统的Rails应用程序中,这将在请求完全处理之后:在过滤器,控制器操作,视图呈现和过滤器之后。查看actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/session/abstract/id.rb

如果你考虑一下,这是完全合理的。每次在会话中放置内容时都会将会话写入其商店会产生大量额外开销。

这是Rails,所以如果你想充分利用它,当然,你可以自己编写一种方法来随时将会话写入存储。我不推荐它。随着Rails的发展,你最终将不得不重新编写代码。

对于ActiveRecord :: SessionStore,一行确实映射到一个会话。 data列是您在会话中放入的每个对象的编码形式。每次请求进入时,Rails都必须通过创建之前存储在其中的所有对象的新实例来重新构建会话。