我需要从Ruby on Rails哈希的哈希值获取GET值
@result = {
"destination_addresses" => [
"Matucana 775, Santiago Centro, Región Metropolitana de Santiago de Chile, Chile"
],
"origin_addresses" => [
"San Pablo 6134, Lo Prado, Región Metropolitana de Santiago de Chile, Chile"
],
"rows" => [
{
"elements" => [
{
"distance" => {
"text" => "10,0 km",
"value" => 9957
},
"duration" => {
"text" => "15 min",
"value" => 903
},
"status"=>"OK"
}
]
}
],
"status"=>"OK"
}
@duration = @result["rows"]["elements"]["distance"]["value"]
@distance = @result["rows"]["elements"]["duration"]["value"]
这导致:
ERROR:
can't convert String into Integer
答案 0 :(得分:1)
问题是rows
和elements
是数组,而不是您在查询中所期望的哈希。这个应该可以正常工作:
@duration = @result["rows"][0]["elements"][0]["duration"]["value"]
@distance = @result["rows"][0]["elements"][0]["distance"]["value"]
简而言之,对于每个puts
操作,可以使用[]
简单地调试此类问题。只需继续输出值到屏幕,直到出现任何错误,这将告诉您应该更仔细地探索散列的哪一部分。
puts "#{@result['rows']}"
puts "#{@result['rows'][0]}"
puts "#{@result['rows'][0]['elements']}"
# etc, till you get an error instead of the value
假设您正在使用Google Maps API,您可能最终会得到一些以不同格式返回数据的查询。有时您可以获得没有行的@result
对象,也可以是没有elements
的行条目。以下是处理此问题的方法:
get_value = lambda do |api_response, inner_key|
result = api_response['rows']
[0, 'elements', 0, inner_key, 'value'].each do |key|
return nil unless result
result = result[key]
end
result
end
@duration = get_value.call(@result, 'duration')
@distance = get_value.call(@result, 'distance')
如果您在此块结尾处的@duration
或@distance
个变量中有nil
,则可以确定Google Maps API无法正确解析您的查询。