Я думаю, что вы можете немного упростить свой код:
@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».