2

(这是关于 Ramaze.net 框架的)

在会话中存储自定义对象时遇到了一些非常奇怪的问题。我注意到只有立即存储在会话中的对象的属性被更新。但是,如果这些对象包含对其他对象的引用,则如果会话中包含的直接对象在请求期间没有更改,则不会更新这些引用的对象。

这个问题只有在使用 Ramaze::FileCache 作为我的会话缓存后端时才变得明显。我相信在使用内存会话时问题被掩盖或不是问题。

我发现问题是因为在 Ramaze::Session::Hash#method_missing (lib/ramaze/current/session/hash.rb) 中找到的会话逻辑中的“浅拷贝”。

作为一个快速测试以确保我的想法是正确的,我注释掉了“差异检查”,基本上每次都强制更新会话。

  def method_missing(*args, &block)
    old = @hash.dup
    result = @hash.send(*args, &block)
    #unless old == @hash
      Cache.sessions[@session.session_id] = self
    #end
    result
  end

这个小技巧解决了我的问题。现在我的问题是:

  1. 这是一个安全合理的解决方案吗?
  2. 我应该避免在会话中存储复杂/深层对象吗?
  3. 有什么我想念的吗?
4

1 回答 1

2

此问题已在最新的 Ramaze (2009.04) 中得到解决,如果问题仍然存在,请在Ramaze 问题跟踪器中提交补丁。

于 2009-04-29T12:12:51.380 回答