2010-08-08 53 views
6

我的代碼必須解析Vcard 2.1格式。 我使用VPIM(沒有其他庫)Vpim :: Vcard - 解析vcard 2.1

當我運行Vpim::Vcard.decode(data)我得到錯誤:

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

堆棧跟蹤:

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' 

我tryed運行gem install vcard,並要求「電子名片'在使用RailsApp初始化後,directry(config.gem在vpim gem之後不包含此文件)(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=

(Exception類是Vpim::InvalidEncodingError

維卡代碼,我嘗試解析:

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

有趣的是,當我一個Rails模型內部解碼第二個錯誤。 當我嘗試從腳本/控制檯直接解碼(在installinv vcard gem和直接包含'vcard'後),我成功獲取Vcard對象。

堆棧跟蹤:

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) 

這裏是IRB axample:

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在軌道上?

+0

你能發佈更多的代碼嗎? 你嘗試解析一個io對象而不是字符串嗎? 你正在使用哪個ruby版本? – elmac 2010-08-11 07:48:49

+0

你可以發佈完整的堆棧跟蹤嗎? – 2010-08-12 09:56:46

+0

我已經更新了這個問題。 – 2010-08-12 13:01:30

回答

11

問題是在Ruby 1.9.1中已經刪除了String#each。 (其功能在String#each_line中持續)。要修復/解決此錯誤,請執行以下任一操作:

  • 在Ruby 1.8.7上運行您的rails應用程序。
  • 您可以編輯Vpim代碼適當地使用String#each_line(併發送VPIM作者補丁)
  • 您可以通過定義each方法

    class String 
        alias_method :each, :each_line 
    end 
    
  • 切換到猴子修補Stringvcard寶石,取自Vpim並支持Ruby 1.9.1。

我推薦第4個選項。

+0

'gem'vpim',git:'https:// github.com/thoughtafter/vpim.git''爲我做了詭計。有些人已經將它修補爲1.9。 – antpaw 2013-06-05 14:27:11