Почему при использовании sort_by появляется сообщение «Произошла ошибка при оценке nil. <=>»? - PullRequest
0 голосов
/ 07 декабря 2010

Это код:

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.<=>

Ответы [ 3 ]

3 голосов
/ 07 декабря 2010

Попробуйте использовать:

person['name'] = entry.elements['title'].text || ''

вместо:

person['name'] = entry.elements['title'].text
3 голосов
/ 07 декабря 2010

Не должна ли последняя строка быть

@contacts.sort_by { |k| k['name'] } if @contacts.size > 0

, а не @contacts[0].size?

Кроме того, попробуйте добавить @contacts.compact! перед сортировкой, чтобы убедиться, что у вас нет значений nil вмассив.

0 голосов
/ 07 декабря 2010

Я думаю, что вы можете немного упростить свой код:

@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'] равно нулю, вы получите ошибку, которую видите, поэтому вам нужно либо пропустить эти элементы, либо использовать значение по умолчанию для поля имени, например «unknown».

...