Rails会话存储模型对象

时间:2016-04-06 04:54:29

标签: ruby-on-rails ruby session ruby-on-rails-4 activerecord

我使用会话来存储我的购物车对象

在我的购物车模型中

@cart = session[:cart] ||= Cart.new

我想使用session存储整个购物车对象,以便我可以使用上面的方法

像这样

<%= @cart %>
#<Cart:0x007efc844d3af0>

<% @cart.clean %>
true

但我的@cart输出很奇怪

第一次运行输出

<%= @cart %>
{"items"=>[]}

<% @cart.clean %>
undefined method `clean'

一切都很好,但第二次输出对象的内容

<% session[:cart] = Cart.new %>
<%= session[:cart] %>
#<Cart:0x007efc868be0a0>

<% session[:cart] = session[:cart] ||= Cart.new %>
<%= session[:cart] %>
#<Cart:0x007efc868be0a0> #Because session[:cart] does not exist
<% session[:cart] = session[:cart] ||= Cart.new %>
<%= session[:cart] %>
{"items"=>[]} #Session does not store the cart object but store the cart object's content

会话可以存储整个对象吗?

或者我做错了什么?

感谢。

编辑:

<% @cart = session[:cart] ||= Cart.new %>
<%= @cart %> #session[:cart] is nil so print Cart.new
<br>
<% session[:cart] = Cart.new %>
<% @cart = session[:cart] ||= Cart.new %>
<%= @cart %> #session[:cart] isn't nil so print session[:cart]

编辑2:

<% @cart = session[:cart] ||= Cart.new %>

我得到两个输出都是Cart对象

当我刷新页面并运行相同的代码时

<%= session[:cart] %>
-> nil
<% session[:cart] = Cart.new %>
<%= session[:cart] %>
-> <Cart:0x00000007c112c0>

@cart应该是会话[:cart],因为会话不是nil而session [:cart]应该是Cart对象,但它输出“{”items“=&gt; []}”

编辑3:

第一次:

<%= session[:cart] %>
-> {"items"=>[]} #Why it isn't a Cart object after I refresh?
<% session[:cart] = Cart.new %>
<%= session[:cart] %>
-> <Cart:0x00000007c112c0>

第二次:

DF.show()

1 个答案:

答案 0 :(得分:2)

始终使用购物车对象。从会话初始化它,执行操作,最后将其序列化回会话。

    class Cart
      def initialize(params={})
        @items = params[:items] || []
      end
    end

    controller:
    @cart = Cart.new(session[:cart])
    //do operations on cart

    session[:cart] = @cart