0

これはコードです:

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

3 に答える 3

3

最後の行は

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

そうではありません@contacts[0].sizeか?

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

于 2010-12-07T19:39:23.243 に答える
3

使用してみてください:

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

それ以外の:

person['name'] = entry.elements['title'].text
于 2010-12-07T19:41:33.137 に答える
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 のサンプルはありませんが、動作するはずです。

が nullの場合element['title']、表示されているエラーが発生するため、これらの要素をスキップするか、「不明」などの名前フィールドのデフォルト値を使用する必要があります。

于 2010-12-07T20:21:53.477 に答える