2010-12-07 13 views
0

ist der Code:Warum bekomme ich "Der Fehler trat bei der Auswertung von Null. <=>" bei Verwendung von sort_by? Dieser

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 

der Fehler:

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

Antwort

3

Versuchen:

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

statt:

person['name'] = entry.elements['title'].text 
+0

Fehler behoben, aber immer noch nicht sortiert – rtacconi

+0

@rtacconi '# sort_by' sortiert das Array nicht an Ort und Stelle, sondern gibt ein neues Array zurück, das sortiert ist. Vielleicht meintest du '@contacts = @ contacts.sort_by ...' ' – Phrogz

+0

Ja, du musst im Allgemeinen Suffix [Array Methoden] (http://ruby-doc.org/core/classes/Array.html#M002185) mit einem '!' damit sie das aktuelle Array ändern können. – david4dev

3

Sollte nicht die letzte Zeile

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

nicht @contacts[0].size sein?

Versuchen Sie auch, vor dem Sortieren @contacts.compact! hinzuzufügen, um sicherzustellen, dass keine nil Werte im Array vorhanden sind. mit

0

ich glaube, Sie Ihren Code ein wenig optimieren können:

@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'] } 

Ich habe keine Proben Ihrer XML um es zu testen, aber es sieht so aus als ob es funktionieren sollte.

Wenn die element['title'] Null ist, erhalten Sie den Fehler, den Sie sehen, so dass Sie entweder diese Elemente überspringen oder einen Standardwert für das Namensfeld verwenden möchten, wie "unbekannt".

Verwandte Themen