Почему я получаю «ошибку при оценке NIL. <=>» При использовании sort_by?
-
09-10-2019 - |
Вопрос
Это код:
xml = REXML::Document.new(data)
@contacts = Array.new
xml.elements.each('//entry') do |entry|
person = {}
person['name'] = entry.elements['title'].text
gd_email = entry.elements['gd:email']
person['email'] = gd_email.attributes['address'] if gd_email
@contacts << person
end
@contacts.sort_by { |k| k['name'] } if @contacts[0].size > 0
Ошибка:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.<=>
Решение
Попробуйте использовать:
person['name'] = entry.elements['title'].text || ''
вместо:
person['name'] = entry.elements['title'].text
Другие советы
Разве последняя строка будет
@contacts.sort_by { |k| k['name'] } if @contacts.size > 0
нет @contacts[0].size
?
Кроме того, попробуйте добавить @contacts.compact!
Перед сортировкой, чтобы убедиться, что у вас нет nil
значения в массиве.
Я думаю, что вы можете немного упростить свой код:
@contacts = Array.new
xml = REXML::Document.new(data)
xml.elements.each('//entry') do |entry|
gd_email = entry.elements['gd:email']
@contacts << {
'name' => entry.elements['title'].text,
'email' => (gd_email) ? gd_email.attributes['address'] : ''
}
end
@contacts.sort_by! { |k| k['name'] }
У меня нет образцов вашего XML, чтобы проверить его, но, похоже, это должно работать.
Если element['title']
Это NULL, вы получите ошибку, которую вы видите, поэтому вы захотите либо пропустить эти элементы, либо использовать значение по умолчанию для поля имени, например, «Неизвестно».
Не связан с StackOverflow