2013-08-22 3 views
0

Я работаю над приложением Sinatra, которое вытягивает список дат через XML-файл, а затем создает хэш всех дат.Ruby parsing XML: нет неявного преобразования String в Integer

У меня возникает странная проблема, которая возникает, когда я вынимаю идентификатор и назначаю его переменной.

Ошибки я получаю: не неявное преобразования строки в Integer и это бросает на event_date_id = event_date["date_id"] линии. У меня почти идентичный метод в моем коде, и он работает нормально. Когда я puts event_date['date_id'], он дает мне правильную цифру date_id.

На всякий случай это помогает, класс event_date ['date_id'] - это REXMLUtiliyNodeString, то же самое, что и поле id в другом методе. Если я попытаюсь сделать event_date['date_id'].to_i, он дает перерывы в этом пункте.

def get_dates(event_id) 

url = "some_url_to_some_xml" 
puts '===================' 
puts "Pulling in #{url}" 
puts '===================' 
date_xml = Crack::XML.parse(open(url)) 

dates = {} 

date_xml['document']['date'].each do | event_date | 

    event_date_id = event_date['date_id'] 

    single_date = { 
    'date_id' => event_date_id, 
    'date_start' => event_date['datestart'], 
    'date_end' => event_date['dateend'], 
    'date_live' => event_date['live'], 
    'time_start' => event_date['timestart'], 
    'time_end' => event_date['timestart'], 
    'date_available' => event_date['date_available'] 
    } 

    dates.merge!(event_date_id => single_date) 

end 

return dates 

end 

Вот формат XML:

<document> 
    <date> 
     <date_id>881908</date_id> 
     <live>y</live> 
     <datestart>2017-08-14</datestart> 
     <dateend>2017-08-15</dateend> 
     <timestart>13:00</timestart> 
     <timeend>0:00</timeend> 
     <date_available>10000</date_available> 
    </date> 
<document> 

У меня есть чувство, что это что-то очень простое, но я нарушающие покой мой мозг, пытаясь понять это. Если бы кто-нибудь мог пролить свет на это, я бы определенно это оценил.

Редактирование 1: Когда я запускаю код в irb, он действительно работает без ошибок. Где-то кажется, что Синатра, стойка или дробовик мешают.

+0

Я знаю, что это менее полезно, но он отлично работает на моей машине (Mac OS 10.8, ruby ​​2.0.0) – kristenmills

+0

Спасибо, что посмотрели. Думаю, это делает что-то не так с моей средой! – chantron

ответ

1

Я нашел причину моей проблемы. Это происходит только тогда, когда я разбираю xml-файл с одной записью для даты/события.

Этот question объясняет точный вопрос, который у меня был, и ответ включает в себя работу, которая работала для меня.

if(!date_xml['document']['date'].is_a?(Array)) 
    date_xml['document']['date'] = [ date_xml['document']['date'] ] 
end 
0

Это сообщение возникает, когда вы пытаетесь использовать индекс строки для поиска значения в массиве.

2.0.0p353 :001 > results = [""] 
=> [""] 
2.0.0p353 :002 > results["x"] 
TypeError: no implicit conversion of String into Integer 
    from (irb):2:in `[]' 
    from (irb):2 
    from /home/jeff/.rvm/rubies/ruby-2.0.0-p353/bin/irb:12:in `<main>' 

Поскольку массивы могут быть доступны только целочисленные индексы, Ruby пытается превратить ваше имя ключа в целое, и не потому, что он не знает, какой номер должен использоваться для представления произвольных данных строки. Следовательно, сообщение «нет неявного преобразования String в Integer».

Если вы столкнулись с этим, ответ должен исправить ваш код, чтобы он не пытался получить доступ к массиву как хэш. Если вы импортируете данные из XML или JSON в предположении, что желаемый ключ всегда присутствует и будет всегда импортироваться, но вы все еще получаете это, ваше предположение неверно; данные не отформатированы, как ожидалось. Либо зафиксируйте данные, либо исправьте код для обработки разного формата.