2016-04-06 3 views
1

Я использую сеанс для хранения моего объекта корзины покупокРельсов сессия магазина объектной модель

в моей корзине модели у меня есть

def initialize 
    @items = Array.new 
end 

def clean 
    @items = Array.new 
end 

Я хочу использовать сессии для хранения всего объекта корзины, так что я могу использовать метод выше

как этот

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

но мой выход @cart странно

первый запуск раз выход

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

<% @cart.clean %> 
true 

все нормально, но второй раз она выдавала содержание объекта

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

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

Может сессия магазин весь объект?

Или что-то я сделал не так?

Спасибо.

EDIT:

<% 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 

EDIT 2:

<% @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] 

У меня оба два выхода Корзина объекта

при обновлении страницы и запустить тот же код

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

@cart shou л.д. быть сессии [: телега], потому что сессия не ноль, а сессия [: корзина] должна быть корзина объекта, но это выход «{» элементы «=> []}»

EDIT 3:

Первый раз:

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

Второй раз:

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

Может ли сеанс хранить объект Cart? Я хочу, чтобы оба 'session [: cart] .clean' и' @ cart.clean' работали, спасибо. –

+1

Хранение объекта в сеансе - это не очень хорошая идея, см. Http://stackoverflow.com/questions/1095714/storing-objects-in-a-session-in-rails. В этой ветке обсуждаются подводные камни. Если вы настаиваете на сохранении объекта в сеансе, вам придется его восстановить, передав params в Cart.new (session [: cart]) или что-то подобное, поскольку сеанс сериализует объект и сохраняет его. Надеюсь это поможет. – Shishir

+0

@Shishir Спасибо за помощь, я не хочу хранить элементы корзины в базе данных, поэтому я помещаю объект тележки в сеанс, а объект тележки - это небольшой массив для хранения идентификатора и количества продукта. Я не понимаю, почему я обновляю страницу, я получаю разный вывод сеанса. Пожалуйста, см. EDIT 2, спасибо. –

ответ

2

Всегда используйте объект корзины. инициализировать его из сеанса, выполнять операции и в конце сериализовать его обратно на сеанс.

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

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

    session[:cart] = @cart 
Смежные вопросы