如何使用Rails在会话中存储ActiveRecord对象?

时间:2012-09-21 17:27:09

标签: ruby-on-rails ruby session web

我正在为我的网站构建一个购物车,我在使用rails会话时遇到了一个问题 ActiveRecord对象:

购物车实际上是一个带有一些OrderItems的Order对象。

将Order对象添加到会话后,Dalli开始引发此异常:

Marshalling error for key 'sessions:9e67886e826819a3213df4f4c89db6e0': can't dump hash with default proc
You are trying to cache a Ruby object which cannot be serialized to memcached.
/home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/server.rb:277:in `dump'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/server.rb:277:in `serialize'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/server.rb:164:in `set'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/server.rb:48:in `request'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/options.rb:18:in `block in request'
    /home/rodrigo/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/options.rb:17:in `request'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/client.rb:251:in `perform'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/client.rb:120:in `set'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/action_dispatch/middleware/session/dalli_store.rb:50:in `set_session'

谷歌搜索,我发现ActiveRecord无法存储在会话中。

那么,在会话中存储此对象的最佳方法是什么? 我将不得不为这些类实现序列化/反序列化方法?

谢谢!

编辑1:

记住订单对象尚未保留!

1 个答案:

答案 0 :(得分:7)

在会话中存储对象是一个坏主意 Storing Objects in a Session in Rails
最好存储对象的id,以便始终检查对象是否处于最新状态。

相关问题