1

Ruby 1.9.3 で Mongoid 3.1 と Sinatra を使用してアプリケーションを作成します。has_many Items という Order というモデルがあります。Order.items に Item を追加しようとするたびに、問題が発生します。少し要約すると、次のルートがあります。

    order = session[:user].get_order(Time.now)
    order.items << Item.new
    order.save
    "Hi, mom!" # Garbage page so that I know nothing else is called.

1 回で問題ありません。2 回実行すると、次のエラーが発生します。

    Warning! Rack::Session::Cookie data size exceeds 4K.
    Warning! Rack::Session::Cookie failed to save session. Content dropped.

これをやめさせようとして、頭を壁にぶつけてきました。セッションですべてのアイテムが読み込まれるのはなぜですか? has_many 関係を正しく使用していませんか?

4

1 に答える 1

1

あなたのUserモデルはおそらくhas_many :orders. Ruby はおそらくMarshal.dump、ユーザー オブジェクトを Cookie にダンプするために呼び出しています。これが巨大になる可能性があることは容易に想像できます。次のことを行う必要があります。

  • セッションには user_id のみを保存します。
  • セッションを Cookie ではなくサーバー側に保存します。

セッションをサーバー側に保存するには、別のミドルウェアを使用する必要があります。セッションを memcache に保存する例については、このページを参照してください。すでに mongo を使用しているため、 Rack::Session::Mongoを使用できます。

Rails を使用していなくても、セッション セキュリティに関する Rails ガイドは参考になります。[リンク]

于 2013-05-18T02:43:26.847 に答える