1

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

这是我要完成的工作:

我正在使用restful-authentication进行登录。但是,当我在 UI 中使用 flex/ruby_amf 时,我必须分别对来自 flex 的每个连接进行身份验证。

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

我将用户与会话关联的方法是在会话表中添加一个“user_id”列,并执行从登录函数调用的 sql“更新会话集 user_id...”类型查询。

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

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

会话表中的记录是在什么时间点创建的?有没有办法更新登录函数中的会话对象并让 Rails 为我将 user_id 写入数据库?

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

谢谢你。

4

1 回答 1

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 都必须通过创建先前存储在其中的所有对象的新实例来重建会话,因为它存在。

于 2009-06-01T18:24:45.667 回答