Как вы называете индекс в .each_with_index - PullRequest
0 голосов
/ 29 января 2011

Не уверен, что это не работает.

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

Таким образом, я могу вызвать конкретный объект следующим образом:

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

Но если я напишу это ..

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

В идеале, я хочу сделать это:

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

Обновление:

Основываясь на некоторых ответах, я попробовал это:

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

Это превращает @calc.payments в:

nil
nil

Хотя резервное копирование, другие, кажется, работают ..

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

А этот ..

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

Как я могу получить доступ к item[idx] в цикле?

Ответы [ 2 ]

1 голос
/ 29 января 2011
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

Обновление:

Хорошо, хорошо, вот полная программа ... скрипт ... который вы можете запустить. Поскольку вы пытаетесь разобраться в Ruby, я думаю, вам стоит поработать с ним вне Rails в течение нескольких минут . Я издевался @calc.payments, что бы это ни было. Этот код будет работать и, очевидно, делать то, что вы хотите.

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

Если вы запустите его, вы должны увидеть:

{: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 голосов
/ 29 января 2011

Вы можете просто сделать это, чтобы получить доступ к значениям.Так как params[:payments] содержит хеш, то для каждого прохода, key, будут назначаться "0", "1" и т. Д., А value будет назначаться хэш с amount_paid и date_paid.

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