1

私は既存の Rails 2 アプリに取り組んでいます。いくつかのハッシュ データ構造をオブジェクトに変換しました。1 つをセッション ストアに配置すると、セッションが破壊され、user_id が消去され、別のログインが強制されるようです。セッションに dalli_store を使用しています。

次のコードにより、セッションが消去されます。

bug = MyClass.get_an_object()
session[:debug] = bug

それがどこで一掃されているのかは明らかではありません。デバッガーでビューのレンダリングの最後までステップスルーでき、セッションは問題ありませんが、UI で別のリンクをクリックすると、session空 (Hash[0]) になり、ログイン ページにリダイレクトされます。

これにコードを少し変更すると、セッションは問題ありません。

bug = MyClass.get_an_object()
session[:debug] = Marshal::dump(bug)

ただし、実際のオブジェクト (ディープ コピーであっても) を保存すると、セッションが失われます。つまり、これでも機能しません:

session[:debug] = Marshal::load( Marshal::dump(bug) )

マーシャリング時の bug.size は約 140K であるため、memcached をオーバーランすることはありません。いずれにせよ、セッションは によってシリアル化されていると想定するMarshal::dump()ので、サイズは同じである必要があります。オブジェクトを保存した後、セッションでオブジェクトにアクセスしてもかまいません。セッションに入れるだけで問題が発生しますが、前述したように、セッションはオブジェクトを保存した後も、ビューのレンダリング中も問題ありません。次のリクエストが開始されるまで、それが破壊されたことに気付きません。

私は困惑しています。

これをデバッグする方法に関する推奨事項はありますか? 現時点では、オブジェクトを保存するために Marshal を明示的に呼び出すことができると思いますが、セッションが破壊されている理由を本当に理解したいと思います。

大きなオブジェクトをセッションに入れるのは悪いことだとわかっていますが、問題のその部分を修正することは、現在のプロジェクトの範囲外です...おそらく後で。さらに、私はここで何が起こっているのか非常に興味があります。

4

0 に答える 0