2008-12-13 69 views
2

(这是关于Ramaze.net框架)Ramaze Session中的复杂或深度对象存储被破坏?

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

当我使用Ramaze :: FileCache 作为会话缓存后端时,这个问题才变得明显。我相信这个问题在使用内存中会话时被屏蔽或不是 问题。

我发现这个问题是因为 “浅拷贝” 在Ramaze发现会话 逻辑::会议::哈希#method_missing的 (LIB/ramaze /电流/会话/ 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. 有什么我失踪了吗?

回答

2

此问题已在最新的Ramaze(2009.04)中解决,如果问题仍然存在,请在Ramaze issue tracker处提供补丁。