2010-08-08 2 views
6

Мой код должен разобрать формат Vcard 2.1. Я использую VPIM (нет другого ЛИЭСА)Vpim :: Vcard - Parsing vcard 2.1

Когда я бег 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' 

I судимого запустить gem install vcard и требовать «визитная карточки 'directry (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' 

приложение/модели/event.rb: 71:

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

Вот axample из 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 > 

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

+0

Вы не могли бы внести более подробную информацию о своем коде? Вы пытались разобрать объект io вместо строки? какая рубиновая версия вы используете? – elmac

+0

Можете ли вы разместить полный стек, пожалуйста? –

+0

Я обновил вопрос. –

ответ

11

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

  • Запустите приложение для рельсов на 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-й вариант.

+0

'gem 'vpim', git: 'https: // github.com/thinkafter/vpim.git'' сделал трюк для меня. некоторые люди уже исправили его для рубина 1.9. – antpaw

 Смежные вопросы

  • Нет связанных вопросов^_^