2013-05-18 3 views
1

Написание приложения с использованием Mongoid 3.1 и Sinatra в Ruby 1.9.3. У меня есть модель под названием Order, которая имеет has_many Items. Всякий раз, когда я пытаюсь добавить элемент к Order.items, я сталкиваюсь с проблемами. У меня есть следующий маршрут, слегка подвешенный:Mongoid has_many relationship вызывает ошибку стойки в стойке в Sinatra

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

Ваш User модель, возможно, has_many :orders. Ruby, вероятно, вызывает Marshal.dump, чтобы сбросить ваш пользовательский объект в файл cookie. Вы можете себе представить, что это может стать огромным. Вы должны сделать следующее:

  • Храните только user_id в сеансе.
  • Сохраните сессию на стороне сервера, а не в файле cookie.

Вам необходимо использовать другое промежуточное программное обеспечение для хранения серверной сессии. См. this page для примера сохранения сеанса в memcache. Поскольку вы уже используете монго, вы можете использовать Rack::Session::Mongo.

Даже если вы не используете Rails, руководство Rails по безопасности сеанса полезно читать. [link]

+0

Gah, вы определенно правы. Как только я заменил сеанс [: user] на просто id, я перестаю получать сообщение. Большое спасибо за то, что помогли мне. –

+0

Похоже, что вы запускаете свою собственную аутентификацию. Вы должны взглянуть на [Warden] (https://github.com/hassox/warden/wiki/overview), который является промежуточным ПО Rack для аутентификации. – davogones

Смежные вопросы