2013-03-10 3 views
0

J'ai ce problème, où je continue à obtenirLooping par Hash (Array)

TypeError: can't convert String into Integer 

C'est là que je vais à travers cet objet @data.

ici est l'objet @data

@data = HTTParty.get("") 

{ 
"body"=>{ 
    "predictions"=>{ 
     "direction"=>{ 
      "prediction"=>[ 
       { 
        "epochTime"=>"1362931090892", 
       }, 
       { 
        "epochTime"=>"1362931747892", 

       }, 
       { 
        "epochTime"=>"1362932467892", 

       }, 
       { 
        "epochTime"=>"1362933187892", 

       }, 
       { 
        "epochTime"=>"1362933847892", 

       } 
      ], 
      "title"=>"xxxx" 
     }, 
     "a"=>"xx", 
     "b"=>"x" 
    }, 
    "name"=>"some" 
} 

}

et mon code pour passer par-dessus a été

<% if @data["body"]["predictions"].present? %> 
    <% @data["body"]["predictions"].each do |p| %> 
     <%p["direction"].each do |d|%> 
      <% d["prediction"].each do |k|%> 
       <h4><%= k["epchoTime.."] %> </h4> 
      <%end%> 
     <%end%> 
     <%end%> 
<%end%> 

Je ne sais pas comment passer par cela, je suppose ceci est dû au fait que je devrais accéder à des choses comme je le fais en C++ avec la valeur name [integer], mais je voudrais utiliser ["name"]. Comment puis-je faire fonctionner mon code?

Merci pour votre temps précieux et considération.

+1

C'est une si ces temps je trouve avoir le XML brut est préférable d'avoir le résultat de l'analyse du code XML dans un hachage. Les nœuds itérés sont beaucoup plus propres. De plus, n'utilisez pas une vue pour faire fonctionner un contrôleur. Analyser les informations dans une structure propre et transmettre les données à la vue. –

+0

Merci l'homme, oui je pense à ne pas analyser xml de httpparty, et le faire pour moi-même. Il semble que je n'aurai pas à passer par ces nombreux problèmes. –

+0

@theTinMan: Votre commentaire devrait peut-être être une réponse :-) –

Répondre

0

L'ensemble des choses de hachage descendais de la main Comme l'avait suggéré Tin man, j'ai utilisé XML 'nokogiri', puis j'ai utilisé la méthode .css pour détecter si elle existait et la boucler, puisque la réponse originale était en xml.

@doc.css('predictions').each do |predictions_node| 
     predictions_node.css('direction').each do |direction_node| 
      direction_node.css('prediction').each do |prediction| 
      // stuff here 

Merci pour votre temps et considération.

0

l'homme de l'étain a un bon point de garder cette logique en dehors de la vue, et devrait être un travail d'un modèle. Voici une vue plus propre cependant.

<% @data['body']['predictions']['direction']['prediction'].each do |x| %> 
    <% x.each do |k, v| %> 
    <h4><%= v %></h4> 
    <% end %> 
<% end %> 
0

On dirait que vous ignorez les touches qui n'ont des valeurs imbriquées disent title et a, b.

 "title"=>"xxxx" 
    }, 
    "a"=>"xx", 
    "b"=>"x" 
}, 

Votre code final devrait ressembler à

if @data["body"]["predictions"].present? 
@data["body"]["predictions"].each do |p| 
    p.each do |d| 
    if d.kind_of? Hash 
    d.each do |k| 
    if k.kind_of? Array 
     k.each do |x| 
     if x.kind_of? Array 
      x.each do |y| 
      if y.kind_of? Hash 
       puts y["epochTime"] 
      end 
      end 
     end 
     end 
    end 
    end 
    end 
    end 
end 
end 

Le code ci-dessus est laid, mais vous êtes C++ programmmer, vous pourriez aimer: P

1

Voici un exemple, en utilisant Nokogiri, de l'analyse syntaxique du XML brut:

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<body> 
    <predictions> 
    <direction> 
     <prediction> 
     <epochTime>1362931090892</epochTime> 
     <epochTime>1362931747892</epochTime> 
     <epochTime>1362932467892</epochTime> 
     <epochTime>1362933187892</epochTime> 
     <epochTime>1362933847892</epochTime> 
     </prediction> 
     <title">xxxx</title> 
     <a>"xx"</a> 
     <b>"x"</b> 
     <name>"some"</name> 
    </direction> 
    </predictions> 
</body> 
EOT 

epoch_times = doc.search('epochTime').map(&:text) 

qui retourne un tableau de epochTime valeurs:

[ 
    [0] "1362931090892", 
    [1] "1362931747892", 
    [2] "1362932467892", 
    [3] "1362933187892", 
    [4] "1362933847892" 
] 

Parfois, nous avons besoin de faire une boucle à travers tous prediction blocs contenant le epochTime blocs. Cela fera:

epoch_times = doc.search('prediction').map{ |predict| 
    predict.search('epochTime').map(&:text) 
} 

[ 
    [0] [ 
     [0] "1362931090892", 
     [1] "1362931747892", 
     [2] "1362932467892", 
     [3] "1362933187892", 
     [4] "1362933847892" 
    ] 
] 

Parfois, vous devez trouver un nœud particulier et saisir tous les éléments d'un certain type à l'intérieur:

doc = Nokogiri::XML(<<EOT) 
<body> 
    <predictions> 
    <direction> 
     <prediction id="1"> 
     <epochTime>1362931090892</epochTime> 
     <epochTime>1362931747892</epochTime> 
     <epochTime>1362932467892</epochTime> 
     <epochTime>1362933187892</epochTime> 
     <epochTime>1362933847892</epochTime> 
     </prediction> 
     <title">xxxx</title> 
     <a>"xx"</a> 
     <b>"x"</b> 
     <name>"some"</name> 
    </direction> 
    </predictions> 
</body> 
EOT 

epoch_times = doc.search('prediction[id="1"]').map{ |predict| predict.search('epochTime').map(&:text) } 

[ 
    [0] [ 
     [0] "1362931090892", 
     [1] "1362931747892", 
     [2] "1362932467892", 
     [3] "1362933187892", 
     [4] "1362933847892" 
    ] 
]