2010-09-17 5 views
0

J'utilise Watir et Ruby pour essayer de slurp une charge de données à partir d'une application Web dans un hachage:avec difficulté à Ruby hash

def getOrders() 

    return orders = slurpOrders() 

end 

def containsOrderNumber(orderNumber) 
    puts orderNumber 
    orders = getOrders 
    puts orders[orderNumber] 
    #puts orders.keys 

    puts "orders has_key? = " + orders.has_key?(orderNumber).to_s 
    return orders.has_key?(orderNumber) 

end 

private 
def slurpOrders() 

    puts @browser.tables[6].row_count 

    rows = @browser.tables[6].rows 

    orders = Hash.new 

    for row in rows do 
     #puts row.column_count 
     if row.column_count == 8 then 
      order = { 
       :sales_channel => row[2], 
       :customer => row[3], 
       :country => row[4], 
       :total => row[5], 
       :time => row[6], 
       :highlight => row[7], 
       :credit_hold => row[8], 
      } 
      orders[ row[1] ] = order 

      #puts row[1] 

     end 
    end 

    return orders 

end 

Je vous appelle containsOrderNumber (« 1136050 ») dans un autre script mais des ordres. renvoie false et les commandes [orderNumber] retournent zéro. Cependant, si je ne commente pas puts.keys, il apparaît comme l'une des clés dans le hachage ...? Je suis super confus - qu'est-ce que je fais mal? Est-ce que quelque chose de bizarre se passe dans le type de données?

Vive

+0

F% $% $% $ .... Oui, je l'ai corrigé en le changeant en ligne [1] .to_s –

+1

Etes-vous sûr que la clé dans le hachage est '1136050' (une chaîne) plutôt que 1136050 (un entier, ce qui aurait plus de sens). ils sont affichés la même chose que la chaîne. – mb14

Répondre

2

Il semble que vous stockez la clé comme un entier et d'essayer de le récupérer sous forme de chaîne. Vous devez juste être cohérent (et soit ajouter une conversion à une chaîne lors du stockage, soit une conversion en un int lors de la récupération).

2

Lorsque vous faites le débogage printf, assurez-vous de ne pas utiliser

puts orders.keys 

mais utilisez

puts orders.keys.inspect 

que inspect vous permettra de distinguer les entiers et les chaînes:

hash = {"1" => :string, 2 => :integer} 
puts hash.keys # Outputs 1(newline)2(newline) 
puts hash.keys.inspect # Outputs ["1", 2](newline)