2014-07-05 46 views
-2

这是使用Httparty从XML响应中作为parsed_response接收的散列数组。Rails根据深度散列值中的键值显示值

困难和混乱的内部遍历并获得价值。

"flights"=>{ 
    "flight"=>{ 
     "segments"=>{ 
      "segment"=>[ (this has square brackets) 
       { 
        "index"=>"3", 
        "departure_airport"=>"DEL", 
        "arrival_airport"=>"CCU", 
        "departure_date_time"=>"2014-07-07T13:20:00", 
        "arrival_date_time"=>"2014-07-07T15:35:00", 
        "flight_number"=>"20", 
        "airline"=>"AI", 
        "operating_airline"=>"AI", 
        "stops"=>"0", 
        "equipment"=>"320", 
        "duration"=>"8100" 
       }, 
       { 
        "index"=>"4", 
        "departure_airport"=>"CCU", 
        "arrival_airport"=>"BLR", 
        "departure_date_time"=>"2014-07-07T18:10:00", 
        "arrival_date_time"=>"2014-07-07T20:40:00", 
        "flight_number"=>"771", 
        "airline"=>"AI", 
        "operating_airline"=>"AI", 
        "stops"=>"0", 
        "equipment"=>"319", 
        "duration"=>"9000" 
       } 
      ] 
     } 
    } 
}, 

要显示上述哈希值我做

<% h["flights"]["flight"]["segments"]["segment"].each do |o,p| %> 
     <% if o.class == Hash %> 
      <strong><%= o['airline'] %></strong> 
      <%= o['arrival_airport'] %> - <%= o['arrival_date_time'] %><br> 
     <% else %> 
      <%= o %> 
     <% end %> 
<% end %> 

注意:简单地把o['airline']循环后会给can't convert String into Integer

else语句是解析低于答复的类型。

"flights"=>{ 
    "flight"=>{ 
     "segments"=>{ 
      "segment"=>{  (no square brackets) 
        "index"=>"3", 
        "departure_airport"=>"DEL", 
        "arrival_airport"=>"CCU", 
        "departure_date_time"=>"2014-07-07T13:20:00", 
        "arrival_date_time"=>"2014-07-07T15:35:00", 
        "flight_number"=>"20", 
        "airline"=>"AI", 
        "operating_airline"=>"AI", 
        "stops"=>"0", 
        "equipment"=>"320", 
        "duration"=>"8100" 
      } 
     } 
    } 
}, 

因此,有<%= 0%>否则statment后,会给

["index", "7"] ["departure_airport", "DEL"] ["arrival_airport", "BLR"] ["departure_date_time", "2014-07-10T07:10:00"] ["arrival_date_time", "2014-07-10T09:50:00"] ["flight_number", "807"] ["airline", "9W"] ["operating_airline", "9W"] ["stops", "0"] ["equipment", "738"] ["duration", "9600"] 

但有<% elsif o=="departure_airport" %> <%= p %> <% end %>就地else语句,会给与键关联的值。

要使用该键获取单个值,这很好。但把上述格式中的所有关键字都拿到自己的价值观上真的很麻烦。

应该有一个更好的方法来解析它,但只是无法弄清楚我将如何推导出一个用例,其中['segment']会根据它是否是哈希或恰好给出结果来适当地给出结果关键。

谢谢。

+0

可能重复的[导轨遍历散列的深阵列(http://stackoverflow.com/questions/24579053/rails-traverse -deep-of-hashes) – dax

+0

某些重复的,相同的海报.. –

+1

@dax不,它不是一个可能的副本。这个问题是我问的。我只是无法穿过内部。这个问题是我不得不提出一些尴尬陈述的更新。喜欢改进它。 – arjun

回答

2

这里的解决办法是循环之前包住HashArray

控制器

​​

视图

<% @segments_array.each do |segment| %> 

    <strong><%= segment['airline'] %></strong> 
    <%= segment['arrival_airport'] %> - <%= segment['arrival_date_time'] %><br> 
    ... 

<% end %> 
+0

这是在else语句之后的<%= segment%>的结果。“[”index“,”7“] [”departure_airport“,”DEL“] [”arrival_airport“,”BLR“] [”departure_date_time“,”2014-07-10T07:10:00“] [”arrival_date_time“, “2014-07-10T09:50:00”] [“flight_number”,“807”] [“airline”,“9W”] [“operating_airline”,“9W”] [“stops”,“0”] [装备“,”738“] [”持续时间“,”9600“]' – arjun

+0

最初没有变化。 – arjun

+0

我想知道是否渲染指定':collection'的部分将处理单个项目与数组,不需要'if'语句。 –

0
[h["flights"]["flight"]["segments"]["segment"]].flatten.each do |segment| 
    puts "#{segment['arrival_airport']} - #{segment['arrival_date_time']}" 
end 

HTH

+0

不是。这没有帮助。我只得到结果,其中后段是一个方括号。哈希。上面的第一个parsed_response块。不适用于parsed_response的第二块。它只显示原始键和值。 – arjun