2016-04-06 5 views
1

Ich benutze Sitzung meines Warenkorb Objekt speichernRails-Session speichert Modellobjekt

in meinem Warenkorb-Modell habe ich

def initialize 
    @items = Array.new 
end 

def clean 
    @items = Array.new 
end 

Ich möchte Sitzung verwenden Objekt ganze Wagen zu speichern, damit ich die Methode verwenden kann, oben

wie diese

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

aber mein @cart Ausgang ist seltsam

ersten Mal laufen sie Ausgang

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

<% @cart.clean %> 
true 

alles ist in Ordnung, aber das zweite Mal, es Ausgabe des Objekts Inhalt

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

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

Can Session-Speicher das ganze Objekt?

Oder gibt es etwas, was ich falsch gemacht habe?

Danke.

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] 

Ich habe beide zwei Ausgänge sind Wagen Objekt

wenn ich die Seite und führen Sie den gleichen Code aktualisieren

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

@cart shou ld werden die Sitzung [: Warenkorb], weil die Sitzung nicht gleich Null ist und die Sitzung [: Warenkorb] sollte Wagen Objekt sein, aber es Ausgabe "{" Elemente "=> []}"

EDIT 3:

Zum ersten Mal: ​​

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

zum zweiten Mal: ​​

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

Kann Session ein Cart-Objekt speichern? Ich möchte, dass sowohl 'session [: cart] .clean' und' @ cart.clean' funktionieren, danke. –

+1

Das Speichern von Objekten in Sitzungen ist keine gute Idee, siehe http://stackoverflow.com/questions/1095714/storing-objects-in-a-session-in-rails. Dieser Thread diskutiert die Fallstricke davon. Wenn Sie darauf bestehen, ein Objekt in der Sitzung zu speichern, müssen Sie es rekonstruieren, indem Sie Parameter an Cart.new (Sitzung [: cart]) oder etwas Ähnliches übergeben, da die Sitzung Objekte serialisiert und speichert. Hoffe das hilft. – Shishir

+0

@Shishir Danke für die Hilfe, ich möchte nicht Warenkorb Artikel in der Datenbank zu speichern, so dass ich das Warenkorb-Objekt Sitzung und das Warenkorb-Objekt ist ein kleines Array, um Produkt-ID und Menge zu speichern. Ich verstehe nicht, warum ich die Seite aktualisiere ich bekomme die unterschiedliche Ausgabe der Sitzung. Bitte beachten Sie EDIT 2, danke. –

Antwort

2

Immer Warenkorb Objekt verwenden. initialisiere es von der Sitzung, führe Operationen durch und am Ende serialisiere es wieder in die Sitzung.

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

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

    session[:cart] = @cart 
Verwandte Themen