Vpim :: Vcard - Парсинг vcard 2.1 - PullRequest
6 голосов
/ 08 августа 2010

Мой код должен анализировать формат Vcard 2.1.Я использую vpim (других библиотек нет)

Когда я запускаю Vpim::Vcard.decode(data) Я получаю сообщение об ошибке:

undefined method `each' for #<String:0x0000000928e778>

StackTrace:

  NoMethodError (undefined method `each' for #<String:0x0000000928e778>):
    vpim (0.695) lib/vpim/rfc2425.rb:82:in `unfold'
    vpim (0.695) lib/vpim/rfc2425.rb:308:in `decode'
    vpim (0.695) lib/vpim/vcard.rb:692:in `decode'
    app/models/event.rb:71:in `block (2 levels) in parse_data'

Я пыталсязапустить gem install vcard и потребовать директорию 'vcard' (config.gem не включает этот файл после gem vpim) после инициализации RailsApp. (config.gem 'vpim' включен в environment.rb). Таким образом, я получаю еще одну ошибку:

;=D0=9D=D0=B0=D0=B4=D1=80=D0=B0=20=D0=B1=D0=B0=D0=BD=D0=BA=20=D0=BE=D0=BB=

(класс исключения - Vpim::InvalidEncodingError)

код Vcard. Я пытаюсь выполнить синтаксический анализ:

BEGIN:VCARD
VERSION:2.1
REV:20090710T151929Z
TEL;CELL:80954130722
X-CLASS:private
END:VCARD

Интересно, что вторая ошибка возникает, когда яЯ декодирую внутри модели Rails.Когда я пытаюсь декодировать напрямую из скрипта / консоли (после установки vcard gem и напрямую, включая vcard), я успешно получаю объект Vcard.

StackTrace:

   Vpim::InvalidEncodingError (;=D0=9D=D0=B0=D0=B4=D1=80=D0=B0=20=D0=B1=D0=B0=D0=BD=D0=BA=20=D0=BE=D0=BB=):
     vcard (0.1.1) lib/vcard/field.rb:106:in `decode0'
     vcard (0.1.1) lib/vcard/field.rb:172:in `initialize'
     vcard (0.1.1) lib/vcard/field.rb:183:in `new'
     vcard (0.1.1) lib/vcard/field.rb:183:in `decode'
     vcard (0.1.1) lib/vcard/rfc2425.rb:308:in `block in decode'
     vcard (0.1.1) lib/vcard/rfc2425.rb:308:in `collect'
     vcard (0.1.1) lib/vcard/rfc2425.rb:308:in `decode'
     vcard (0.1.1) lib/vcard/vcard.rb:686:in `decode'
     app/models/event.rb:71:in `block (2 levels) in parse_data'

app / models / event.rb: 71:

vcard = Vpim::Vcard.decode(contact.text)

Вот пример из irb:

95-25-164-74:~ smix$ irb
ruby-1.9.2-rc2 > str = <<EOS
ruby-1.9.2-rc2"> BEGIN:VCARD
ruby-1.9.2-rc2"> VERSION:2.1
ruby-1.9.2-rc2"> REV:20090710T151929Z
ruby-1.9.2-rc2"> TEL;CELL:80954130722
ruby-1.9.2-rc2"> X-CLASS:private
ruby-1.9.2-rc2"> END:VCARD
ruby-1.9.2-rc2"> EOS
 => "BEGIN:VCARD\nVERSION:2.1\nREV:20090710T151929Z\nTEL;CELL:80954130722\nX-CLASS:private\nEND:VCARD\n" 
ruby-1.9.2-rc2 > require 'vpim'
 => true 
ruby-1.9.2-rc2 > Vpim::Vcard.decode str
NoMethodError: undefined method `each' for #<String:0x000001010e0428>
    from /Users/smix/.rvm/gems/ruby-1.9.2-rc2/gems/vpim-0.695/lib/vpim/rfc2425.rb:82:in `unfold'
    from /Users/smix/.rvm/gems/ruby-1.9.2-rc2/gems/vpim-0.695/lib/vpim/rfc2425.rb:308:in `decode'
    from /Users/smix/.rvm/gems/ruby-1.9.2-rc2/gems/vpim-0.695/lib/vpim/vcard.rb:692:in `decode'
    from (irb):10
    from /Users/smix/.rvm/rubies/ruby-1.9.2-rc2/bin/irb:17:in `<main>'
ruby-1.9.2-rc2 > 

Как можно проанализировать Vcard 2.1 в рельсах?

1 Ответ

11 голосов
/ 16 августа 2010

Проблема в том, что String#each был удален в Ruby 1.9.1.(Его функциональность сохраняется в String#each_line).Чтобы исправить / обойти эту ошибку, выполните любое из следующих действий:

  • Запустите приложение rails на Ruby 1.8.7.
  • Вы можете отредактировать код Vpim для использования String#each_line соответственно (и отправить авторам vpim патч)
  • Вы можете обезопасить класс String, определив метод each

    class String
      alias_method :each, :each_line
    end
    
  • Переключитесь на камень vcard , который взят из Vpim и имеет поддержку Ruby 1.9.1.

Я рекомендую 4-й вариант.

...