Mongoid has_many关系导致Sinatra中的机架cookie错误

时间:2013-05-18 02:12:20

标签: ruby cookies sinatra mongoid rack

在Ruby 1.9.3中使用Mongoid 3.1和Sinatra编写应用程序。我有一个名为Order的模型has_many Items。每当我尝试将一个Item附加到Order.items时,我就会遇到问题。我有以下路线,总结一下:

    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.

一次这样做是可以的;两次这样做会导致以下错误:

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

我一直在撞墙,试图让它停止这样做。为什么会话加载我的所有项目?我没有正确使用has_many关系吗?

1 个答案:

答案 0 :(得分:1)

您的User模型可能has_many :orders。 Ruby可能会调用Marshal.dump将您的用户对象转储到cookie中。你可以想象这可能会变得巨大。您应该执行以下操作:

  • 仅将user_id存储在会话中。
  • 存储会话服务器端而不是cookie。

您需要使用不同的中间件来存储会话服务器端。有关在memcache中存储会话的示例,请参阅this page。由于您已经在使用mongo,因此可以使用Rack::Session::Mongo

即使您没有使用Rails,Rails会话安全指南也很有用。 [link]