2012-05-10 9 views
5

Das ist der Hash-I auf, arbeite„kann nicht konvertieren Symbol in Integer“ weird Fehler

a = { 
    #... 
    :fares => { 
    :itinerary_fare => { 
     :segment_names=>"C", 
     :free_seats => "6", 
     :fare_for_one_passenger => { 
     :free_seats=>"0", 
     :@currency => "TL", 
     :@non_refundable => "false", 
     :@price => "439.0", 
     :@service_fee => "25.0", 
     :@tax => "33.0", 
     :@type => "Y" 
     }, 
     :@currency => "TL", 
     :@non_refundable => "false", 
     :@price => "439.0", 
     :@service_fee => "25.0", 
     :@tax => "33.0", 
     :@type => "C" 
    }, 
    :@currency => "TL", 
    :@tax => "33.0" 
    }, 
    #.. 
} 

auch hier ein weiteres Beispiel http://pastebin.com/ukTu8GaG.

Der Code, der mir headhaches gibt,

a[:fares][:itinerary_fare].each do |f| 
    puts f[:@price] 
end 

Wenn ich das in die Konsole schreiben, es gibt mir eine Fehlermeldung „nicht Symbol in Integer umwandeln kann“. Aber wenn ich schreibe, a[:fares][:itinerary_fare][:@price] funktioniert es ziemlich gut.

Der seltsamste Teil ist, wenn ich den Code in eine Datei haml

%tbody 
    [email protected] do |a| 
    %tr.flight 
     %td 
     -a[:fares][:itinerary_fare].each do |f| 
     -puts f[:@price] #Weird stuff happens here 
     .prices 
     %input{:type=>"radio",:name=>"selectedfight",:value=>"#{a[:id]}"} 
      = f[:@price] 
     %br 

Es funktioniert schreiben, es Preise zu meiner Konsole druckt, aber es scheitert an der gleichen Linie.

Dies ist der störendste Fehler, den ich jemals gesehen habe, danke für jede Hilfe.

Meistens gibt es mehr als 1 :itinerary_fare, ich muss iterieren.

können Meine Daten als http://postimage.org/image/6nnbk9l35/

Antwort

8

a[:fares][:itinerary_fare] ein Hash ist angezeigt. Hash#eachyields key-value-pair arrays an den Block.

So nimmt f z.B. das Array [:@price, "439.0"] im Block.

Daher verwenden Sie ein Symbol (:@price) als Array-Index. Eine ganze Zahl wird erwartet. In a[:fares][:itinerary_fare][:@price] geben Sie es als Hash-Schlüssel, der natürlich funktioniert.

-1

Warum haben Sie die vorherige Frage gelöscht, die bereits korrekt beantwortet wurde? Sie konnten es nur mit mehr Informationen aktualisieren. Wie von anderen Benutzern in Ihrem vorherigen Beitrag beantwortet wurde, durchlaufen Sie die Elemente in a[:fares][:itinerary_fare]. Sie können sehen, mit:

a[:fares][:itinerary_fare].each do |f| 
    puts f 
end 

und Sie nicht eine Schleife, dann können Sie verwenden:

a[:fares][:itinerary_fare][:@price] 

Wenn Sie mehr als eine haben: itinerary_fare es wird nur die letzte betrachten, da es ein ist Schlüssel des Hash: Tarife. Vielleicht brauchen Sie ein Array wie (links minimal der Elemente):

a = {:id=>"1", 
    :fares=>{ 
     :itinerary_fares=>[{:@price=>"439"}, {:@price=>"1000"}] 
    } 
} 

und dann:

a[:fares][:itinerary_fares].each do |f| 
    puts f[:@price] 
end 
+1

ich es gelöscht haben, weil es mit meinen Freunden SO-Konto versehentlich, sorry für Probleme gepostet – gkaykck