【问题标题】:Mongoid has_many relationship causes Rack cookie error in SinatraMongoid has_many 关系导致 Sinatra 中的 Rack cookie 错误
【发布时间】:2013-05-18 02:12:20
【问题描述】:

在 Ruby 1.9.3 中使用 Mongoid 3.1 和 Sinatra 编写应用程序。我有一个名为 Order 的模型,它包含多个项目。每当我尝试将项目附加到 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 关系吗?

【问题讨论】:

    标签: ruby cookies sinatra mongoid rack


    【解决方案1】:

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

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

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

    即使您没有使用 Rails,Rails 会话安全指南也是有用的阅读材料。 [link]

    【讨论】:

    • 呸,你绝对是对的。一旦我只用 id 替换 session[:user] ,我就会停止收到消息。非常感谢您帮助我。
    • 听起来您正在滚动自己的身份验证。你应该看看Warden,这是用于身份验证的 Rack 中间件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2014-05-25
    相关资源
    最近更新 更多