2014-05-07 2 views
5

Ich stoße in Ruby on Rails auf etwas Seltsames. Ich arbeite an einer Website, auf der Nutzer bestimmte Dinge kaufen und einen mehrstufigen Checkout-Prozess durchlaufen können. Ich verwende ein Session-Objekt als Hash, um Daten zu anderen Aktionen im Controller zu übertragen.Ruby on Rails verändert verschachtelte Hash-Schlüssel von Symbolen zu Strings

Hier ist, was es sieht im Grunde wie

class CheckoutController < ApplicationController 
    def index 
    #stuff 
    end 
    def create 
    #stuff 

    session[:checkout_data] = {} #initialize all the checkout data as hash 
    # Insert the :items_to_purchase key with the value as a new Items model instance 
    session[:checkout_data][:items_to_purchase] = Items.new(post_data_params) #as an example 

    redirect_to :action => 'billing_info' 
    end 

So habe ich einige Daten in der ersten POST-Anforderung des Formulars erstellt das Items Modell. Gehen wir zur nächsten Seite, auf der der Benutzer Rechnungsinformationen eingibt.

def billing_info 
    if request.get? 
     @items_to_purchase = session[:checkout_data][:items_to_purchase] 
    end 
    if request.post? 
     # ... 
    end 
    end 
end 

Mein Problem ist auf der Linie

@items_to_purchase = session[:checkout_data][:items_to_purchase]. 

Der Schlüssel :items_to_purchase nicht vorhanden ist, und stattdessen ist 'items_to_purchase' der Schlüssel. Was ist passiert? Ich habe diesen Schlüssel speziell initialisiert, um ein Symbol anstelle einer Zeichenfolge zu sein! Ruby hat es hinter meinem Rücken verändert! Scheint dies nicht zu tun, wenn ich nur einen flachen Hash habe, aber mit diesen verschachtelten Hashes tritt dieses Problem auf.

Jeder hat einen Einblick, was passiert?

Antwort

6

Sitzungen, wenn Sie Cookies verwenden, leben nicht in Ruby - sie werden über das Netzwerk hin und her übertragen. Das Objekt , in dem Sie Ihre Daten gespeichert haben, ist nicht dasselbe session Objekt, von dem Sie versucht haben, es zu lesen. In Cookie-Form gibt es keinen Unterschied zwischen Strings und Symbolen. Verwenden Sie Hash#symbolize_keys!, um sicherzustellen, dass Sie Ihre Schlüssel haben, wie Sie möchten, oder verwenden Sie einfach die Zeichenfolgenschlüssel konsistent.

0
session[:checkout_data] = {} #initialize all the checkout data as hash 

Sie zuweisen hier einen normalen Hash statt ActionDispatch :: Anfrage :: Session (das Objekt durch Session-Methode zurückgegeben wird).

0

Ich stieß heute auf dieses Problem. Hier ist, wie ich es lösen konnte ... hoffe das hilft!

def first_method 
    session[:thing_to_store] = ThingToStore.new(params)).to_yaml 
    end 

def second_method 
    session[:thing_to_store] = YAML.load(session[:thing_to_store]) 
end 
0

Es auf Schienen Version abzuhängen scheint, wenn ich 4.1.0 bin mit, ich habe das gleiche Problem, aber unser älteres System mit 4.0.3, Symbol als Schlüssel Sitzung Werke abzurufen.