Rails 3.1 хеш каждый дает TypeError - PullRequest
0 голосов
/ 16 августа 2011

У меня есть хеш (Hash.from_xml), который выглядит следующим образом (из проверки):

{
"FileName"=>"hofplayers.xml",
"Version"=>"1.0",
"UserID"=>"3955847", 
"FetchedDate"=>"2011-08-16 00:41:02", 
"PlayerList"=>{
    "Player"=>{
        "PlayerId"=>"92121587", 
        "FirstName"=>"Gennady", 
        "NickName"=>nil, 
        "LastName"=>"Buzykin", 
        "Age"=>"45", 
        "NextBirthday"=>"2011-09-24 22:10:00", 
        "ArrivalDate"=>"2008-03-08 16:37:00", 
        "ExpertType"=>"15", 
        "HofDate"=>"2010-01-23 16:10:00", 
        "HofAge"=>"40"
        }
    }
}

Затем я повторяю с каждым, поскольку может быть более одного игрока:

<% @hof['PlayerList']['Player'].each do |player| %>
    <%= player['NickName']%>
<% end %>

И с ошибкой TypeError: невозможно преобразовать строку в целое число .Но это работает, как я хочу, когда есть более одного игрока.Кажется, проблема в том, что когда один игрок создает массивы вместо хеша, player.inspect выдает:

 ["PlayerId", "92121587"]
 ["FirstName", "Gennady"]
 ["NickName", nil]
 ["LastName", "Buzykin"]
 ["Age", "45"]
 ["NextBirthday", "2011-09-24 22:10:00"]
 ["ArrivalDate", "2008-03-08 16:37:00"]
 ["ExpertType", "15"]
 ["HofDate", "2010-01-23 16:10:00"]
 ["HofAge", "40"]

вместо

 {
     "PlayerId"=>"25787535", 
     "FirstName"=>"Rico", 
     "NickName"=>nil, 
     "LastName"=>"van Oostveen", 
     "Age"=>"42", 
     "NextBirthday"=>"2011-10-23 22:18:00", 
     "ArrivalDate"=>"2006-02-11 18:43:00", 
     "ExpertType"=>"2", 
     "HofDate"=>"2010-04-25 22:01:00", 
     "HofAge"=>"38"
 }

Так что я делаю неправильно

Ответы [ 2 ]

0 голосов
/ 16 августа 2011

Одна вещь, которая приходит на ум, это то, что это:

<% @hof['PlayerList']['Player'].each do |player| %>
  <%= player['NickName']%>
<% end %>

не проходит через игроков.Он перебирает пары имя / значение хэша Player.РЕДАКТИРОВАТЬ.Под этим я подразумеваю, что он будет проходить через key1, value1, key2, value2, key3, ... и т. Д.По одному на каждую итерацию цикла ...

Я думаю, вы захотите что-то вроде этого:

<% @hof['PlayerList'].each_pair do |player, player_data| %>
  <%= player_data['NickName']%>
<% end %>
0 голосов
/ 16 августа 2011

Когда вы делаете each в Hash, вы получаете список пар ключ / значение, затем вы пытаетесь проиндексировать эти пары строкой, и это дает вам ошибку. Вы не можете многое сделать, чтобы изменить то, что делает from_xml, но вы можете обойти это.

Вы можете исправить хэш в вашем контроллере:

if(@hof['PlayerList']['Player'].is_a?(Hash))
    @hof['PlayerList']['Player'] = [ @hof['PlayerList']['Player'] ]
end
# or
if(!@hof['PlayerList']['Player'].is_a?(Array))
    @hof['PlayerList']['Player'] = [ @hof['PlayerList']['Player'] ]
end

Если у вас нет того, что вы ожидаете, вы просто сделаете его массивом с одним элементом; какой тест вы выберете, зависит от того, какие вещи вы ожидаете получить от from_xml, но я бы склонялся к проверке «не массив», поскольку она точно соответствует тому, что вы пытаетесь сделать.

Или вы можете попробовать разобраться в этом:

<% [ @hof['PlayerList']['Player'] ].flatten(1).each do |player| %>

Это в основном оборачивает все, что у вас есть в массиве, а затем выравнивает его на один уровень, вызов flatten(1) необходим, если у вас уже есть массив. Если вы начинаете с массива, то [ ].flatten(1) - это неоперация (вызов flatten отменит то, что делает []), который не будет иметь какого-либо заметного эффекта, кроме немного потерянного процессорного времени; если вы начнете с хэша, [ ... ] превратит его в массив, а flatten ничего не сделает (но потратит немного ресурсов ЦП).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...