(これは 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
この小さなハックは私の問題を解決しました。今私の質問は次のとおりです。
- それは安全で合理的な解決策ですか?
- 複雑な/深いオブジェクトをセッションに保存するのは避けるべきですか?
- 足りないものはありますか?