Rails语法错误为每个循环分配变量

时间:2012-01-14 04:56:11

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试通过执行以下操作,通过将外部请求分配给变量来创建要发送的收件人列表:

recipients = @items.each do |item|
  {"email"=>"#{Recipient.find_by_id(item.recip_id).email}", "amount"=>"#{item.price}"},
end

但是我收到了这个错误:

syntax error, unexpected ',', expecting '}'

我知道我所做的并不是正确的语法。我是一个Ruby新手,所以有人可以帮我找出正确的语法吗?

编辑:感谢您的投入。但是如果我需要为每个项目做两个哈希呢?

recipients = @items.map do |item|
  {"email"=>"#{Recipient.find_by_id(item.recip_id).email}", "amount"=>"#{item.price}"},
  {"email"=>"#{Store.find_by_id(item.recip_id).email}", "amount"=>"#{item.price}"}
end

2 个答案:

答案 0 :(得分:3)

问题在于散列末尾的逗号。此外,如果您要将电子邮件和金额存储在收件人中,则应使用地图。这将返回一个带有电子邮件和金额的哈希数组:

recipients = @items.map do |item|
  {"email"=> Recipient.find_by_id(item.recip_id).email, "amount"=> item.price}
end

另外,正如您可能注意到的,我不需要将电子邮件和价格的值作为字符串传递。

答案 1 :(得分:1)

如果您想从map块中返回多个哈希值,那么最好切换到each_with_object

  

使用给定的任意对象迭代每个元素的给定块,并返回最初给定的对象。

这样的事情:

recipients = @items.each_with_object([]) do |item, a|
  a << {"email"=>"#{Recipient.find_by_id(item.recip_id).email}", "amount"=>"#{item.price}"}
  a << {"email"=>"#{Store.find_by_id(item.recip_id).email}", "amount"=>"#{item.price}"}
end