首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vpim::Vcard -解析vcard 2.1

Vpim::Vcard -解析vcard 2.1
EN

Stack Overflow用户
提问于 2010-08-08 12:13:08
回答 1查看 3.1K关注 0票数 6

我的代码必须解析Vcard 2.1格式。我使用的是vpim(没有其他库)

当我运行Vpim::Vcard.decode(data)时,我得到了错误:

代码语言:javascript
复制
undefined method `each' for #<String:0x0000000928e778>

StackTrace:

代码语言:javascript
复制
  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'

我尝试在RailsApp初始化后运行gem install vcard并要求'vcard‘目录(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=

(异常类为Vpim::InvalidEncodingError)

我尝试解析的Vcard代码:

代码语言:javascript
复制
BEGIN:VCARD
VERSION:2.1
REV:20090710T151929Z
TEL;CELL:80954130722
X-CLASS:private
END:VCARD

有趣的是,第二个错误发生在我在Rails模型中解码的时候。当我尝试直接从脚本/控制台解码时(在installinv vcard gem和直接包含‘Vcard’之后),我成功地获得了Vcard对象。

StackTrace:

代码语言:javascript
复制
   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:

代码语言:javascript
复制
vcard = Vpim::Vcard.decode(contact.text)

下面是来自irb的示例:

代码语言:javascript
复制
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 > 

如何在rails中解析Vcard 2.1?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-17 00:44:44

问题是String#each在Ruby1.9.1中被删除了。(它的功能保留在String#each_line中)。要修复/解决此错误,请执行以下任一操作:

  • 在Ruby1.8.7.上运行您的rails应用程序。
  • 您可以编辑Vpim代码以适当地使用String#each_line (并向vpim作者发送补丁)
  • 您可以通过定义<代码>d11>方法来修补String

类字符串alias_method :each,:each_line end

  • 切换到Ruby,它取自Vpim,支持vcard 1.9.1。

我推荐第四个选项。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3433052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档