2011-01-29 1 views
0

Vous ne savez pas si cela ne fonctionne pas.Comment appelez-vous un index dans .each_with_index

>> params[:payments] 
{"0"=>{":amount_paid"=>"80.00", ":date_paid"=>"2/27/2008"}, "1"=>{":amount_paid"=>"100.00", ":date_paid"=>"5/8/2008"}} 

Je peux appeler un objet spécifique avec ceci:

>> params[:payments][:"1"] 
    {":amount_paid"=>"100.00", ":date_paid"=>"5/8/2008"} 

Mais si j'écris ceci ..

>> params[:payments].each_with_index{|item, idx| item[:"#{idx}"]} 
TypeError Exception: Symbol as array index 

Idéaliste, je veux y arriver:

params[:payments].each_with_index do |item, idx|  
    @calc.payments[idx][:date_paid] = item[:"#{idx}"][":amount_paid"] 
    @calc.payments[idx][:amount_paid] = (item[:"#{idx}"][":amount_paid"]).to_f 
end 

Mise à jour:

Sur la base des réponses, I'ved essayé ceci:

params[:payments].each{|k,v| @calc.payments[k.to_i] = v[":amounts_paid"]} 

Cela transforme @calc.payments en:

nil 
nil 

Sauvegarde cependant, les autres semblent fonctionner ..

>> params[:payments].each{|k,v| p v[":amount_paid"]} 
"80.00" 
"100.00" 

Et celui-ci ..

>> params[:payments].each{|k,v| p @calc.payments[k.to_i]} 
{:date_awarded=>"1/2/2008", :judgement_balance=>1955.96} 
nil 

Comment puis-je accéder à item[idx] dans une boucle?

Répondre

1
params[:payments].each do |k,v| 
    puts "Item %d amount=%s date=%s\n" % [k, v[":amount_paid"], v[":date_paid"]] 
end 
Item 0 amount=80.00 date=2/27/2008 
Item 1 amount=100.00 date=5/8/2008 

Mise à jour:

Ok, ok, voici un programme complet .. scénario .. que vous pouvez réellement exécuter. Puisque vous essayez de donner un sens à Ruby, je pense que vous devriez travailler avec lui en dehors de Rails pendant quelques minutes. Je me suis moqué @calc.payments, peu importe ce que c'est. Ce code va fonctionner et apparemment faire ce que vous voulez.

require 'pp' 
(params = {})[:payments] = {"0"=>{":amount_paid"=>"80.00", ":date_paid"=>"2/27/2008"}, "1"=>{":amount_paid"=>"100.00", ":date_paid"=>"5/8/2008"}} 
pp params 
class T; attr_accessor :payments; end 
(@calc = T.new).payments = [] 
params[:payments].each do |k,v| 
    i = k.to_i 
    @calc.payments[i] ||= {} 
    @calc.payments[i][:date_paid] = v[":date_paid"] 
    @calc.payments[i][:amount_paid] = v[":date_paid"].to_f 
end 
pp @calc.payments 

Si vous exécutez vous devriez voir:

{:payments=> 
    {"0"=>{":amount_paid"=>"80.00", ":date_paid"=>"2/27/2008"}, 
    "1"=>{":amount_paid"=>"100.00", ":date_paid"=>"5/8/2008"}}} 
[{:date_paid=>"2/27/2008", :amount_paid=>2.0}, 
{:date_paid=>"5/8/2008", :amount_paid=>5.0}] 
+0

Je me demande s'il est possible d'utiliser cette variable d'injection que vous avez utilisée pour écrire les paramètres sur lesquels je travaille dessus. Est-ce que c'est SQL? Je n'ai jamais vu ça avant. – Trip

+0

Wow merci beaucoup DigitalRoss! – Trip

0

Vous pouvez simplement faire ceci pour accéder aux valeurs. Étant donné que params[:payments] contient un hachage, key, key sera attribué à "0", "1", etc., et value sera affecté au hachage avec amount_paid et date_paid.

params[:payments].each do |key, value| 
    amount_paid = value[":amount_paid"] 
    ... 
end 
+0

mis à jour ma réponse semble above..still à ne pas travailler .. – Trip

+0

La première ligne de votre code mis à jour peut nécessiter un '.to_f' à la fin de 'v [": montants_payés "]' –