2012-05-10 7 views
5

Il è l'hash sto lavorando su,“non può convertire i simboli in Integer” strano errore

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

anche qui un altro esempio http://pastebin.com/ukTu8GaG.

Il codice che mi dà headhaches,

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

Se scrivo questo in console, mi dà "Non posso convertire Simbolo in Integer" errore. Ma se scrivo, a[:fares][:itinerary_fare][:@price] funziona abbastanza bene.

La parte più strana è, se scrivo il codice in un file 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 

Funziona, stampa i prezzi al mio console, ma non riesce alla stessa linea.

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

Questo è l'errore più inquietante che abbia mai visto, grazie per qualsiasi aiuto.

La maggior parte delle volte ci sono più di 1 :itinerary_fare, devo iterare.

miei dati possono essere visualizzati come http://postimage.org/image/6nnbk9l35/

risposta

8

a[:fares][:itinerary_fare] è un Hash. Hash#eachyields key-value-pair arrays al blocco.

Quindi, f prende ad es. l'array [:@price, "439.0"] nel blocco.

Quindi si sta utilizzando un simbolo (:@price) come indice di matrice. È previsto un numero intero.

In a[:fares][:itinerary_fare][:@price] si sta dando come chiave hash che funziona, naturalmente.

-1

Perché hai eliminato la domanda precedente, che era già correttamente risposto? Potresti solo aggiornarlo con ulteriori informazioni. Come è stato risposto da un altro utente nel tuo post precedente stai iterando sugli elementi in a[:fares][:itinerary_fare]. Si può vedere questo con:

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

E non avete bisogno di un ciclo, è possibile utilizzare:

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

Se si dispone di più di una: itinerary_fare prenderà in considerazione solo l'ultimo, in quanto si tratta di un chiave dell'hash: tariffe. Forse avete bisogno di una matrice simile (a sinistra al minimo di elementi):

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

e poi:

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

ho cancellato perché è stato pubblicato con i miei amici SO rappresentano accidentalmente, mi dispiace per eventuali problemi – gkaykck