2010-12-07 9 views
0

これはコードです:sort_byを使用しているときに、「nil。<=>」を評価中にエラーが発生したのはなぜですか?

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

は使用してみてください:

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

の代わり:

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

エラーは解決されましたが、まだソートされていません – rtacconi

+0

@rtacconi '#sort_by'は、配列をその場所でソートせず、ソートされた新しい配列を返します。おそらく、あなたは '@contacts = @ contacts.sort_by ... 'を意味していたでしょう。 – Phrogz

+0

はい、一般的に接尾辞[配列メソッド](http://ruby-doc.org/core/classes/Array.html#M002185)が必要です。 ) とともに '!'現在の配列を変更することができます。 – david4dev

3

は、最後の行は

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

ない@contacts[0].sizeではないでしょうか?

並べ替えの前に@contacts.compact!を追加して、配列にnil値がないことを確認してください。

0

私はあなたのコードビットを合理化することができると思う:

@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の場合は、表示されているエラーが表示されるため、これらの要素をスキップするか、「不明」などの名前フィールドのデフォルト値を使用します。