为什么我不能从这个Ruby哈希中访问一个项目?

时间:2011-03-12 22:41:28

标签: ruby ruby-on-rails-3

我有一个如下所示的数据结构:

@results['events'].each do |event|
  event.inspect
end
["event", {"modified"=>"2011-03-04 12:39:13", "groups"=>nil, "country_name"=>"United States", "city_name"=>"Morrison", "latitude"=>39.653992, "title"=>"Red Rocks Indian Art Show", "region_name"=>"Colorado"}] 

OR

@results['events']['event'].each do |event|
  event.inspect
end
["modified", "2011-03-04 12:39:13"] ["groups", nil] ["country_name", "United States"] ["city_name", "Morrison"] ["latitude", 39.653992] ["title", "Red Rocks Indian Art Show"]

我认为我可以这样做:

@results['events']['event'].each do |event|
  event['modified']
end

但是当我这样做时,我得到了这个: 无法在包含以下内容的行上将String转换为Integer:event['modified']

我做错了什么?

2 个答案:

答案 0 :(得分:3)

inspect返回一个字符串。 each会丢弃从块返回的值,因此实际上您在输出中看到的是调用each的对象的值。使用p obj打印obj

你得到“无法将字符串转换为整数”,因为如果你在each实例上调用Hash并向其传递单参数块,则使用表示键值对的数组调用此块(比如[key, value])。在event['modified']中,您尝试使用String索引从数组中获取值。数组只接受整数索引,因此Ruby会尝试进行转换并失败。

你想要的是

@results['events']['event'].each do |eventProperty, eventPropertyValue|
  # do something here
end

答案 1 :(得分:0)

Rails只允许数组的数字索引。

尝试按如下方式重构数据结构:

events = [
           {
             :name => "event",
             :modified => "2011-03-04 12:39:13",
             :groups => nil,
             :country_name => "United States",
             :city_name => "Morrison",
             :latitude => 39.653992,
             :title => "Red Rocks Indian Art Show",
             :region_name => "Colorado"
           }
         ]

拥有一个哈希数组更有意义:每个事件一个哈希。使用符号作为散列键也更清晰,更有效。

希望有所帮助。