2012-05-10 20 views
5

El es el hash que estoy trabajando,“no se puede convertir en símbolo Entero” raro error

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" 
    }, 
    #.. 
} 

también aquí otro ejemplo http://pastebin.com/ukTu8GaG.

El código que me da headhaches,

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

Si escribo esto en la consola, que me da "No se puede convertir en símbolo Entero" error. Pero si escribo, a[:fares][:itinerary_fare][:@price] funciona bastante bien.

Lo más extraño es, si escribo el código en un archivo 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 

Funciona, imprime los precios a mi consola, sin embargo, se produce un error en la misma línea.

can't convert Symbol into Integer file: flights.haml location: [] line: 18 

Este es el error más inquietante que he visto, gracias por cualquier ayuda.

La mayoría de las veces hay más de 1 :itinerary_fare, tengo que repetir.

Mis datos se pueden mostrar como http://postimage.org/image/6nnbk9l35/

Respuesta

8

a[:fares][:itinerary_fare] es una Hash. Hash#eachyields key-value-pair arrays al bloque.

Por lo tanto, f toma p. la matriz [:@price, "439.0"] en el bloque.

Por lo tanto, está utilizando un símbolo (:@price) como un índice de matriz. Se espera un entero.

En a[:fares][:itinerary_fare][:@price] lo está dando como una clave hash que funciona por supuesto.

-1

¿Por qué eliminó la pregunta anterior, que ya estaba correctamente respondió? Solo podría actualizarlo con más información. Como fue respondido por otro usuario en su publicación anterior, está iterando sobre los elementos en a[:fares][:itinerary_fare]. Esto se puede ver con:

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

Y usted no necesita un bucle, puede utilizar:

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

Si usted tiene más de uno: itinerary_fare sólo se tendrá en cuenta la última, ya que es una clave del hash: tarifas. Tal vez usted necesita un arreglo similar (izquierda a un mínimo de elementos):

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

y luego:

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

he suprimido porque fue publicada con mis amigos SO cuenta de forma accidental, lo siento por cualquier problema – gkaykck

Cuestiones relacionadas