我正在使用 Vpim 生成 .vcf 文件,然后用户可以将这些文件导入到他们的地址簿中。我遇到的问题是他们下载的信息是针对公司而不是个人的,因此我需要将卡片标记为这样。有没有办法使用 Vpim 来做到这一点,或者有没有其他 gem 可以用来完成这个任务?

def to_vcf
  card = Vpim::Vcard::Maker.make2 do |maker|
  ...
  end
end

来自地址簿的名片来源
BEGIN:VCARD
VERSION:3.0
N:;;;;
FN:The Flow Skatepark
ORG:The Flow Skatepark;
item1.TEL;type=pref:(614) 864-1610
item1.X-ABLabel:Work #
item2.ADR;type=WORK;type=pref:;;4252 Groves Rd;Columbus;OH;43232;USA
item2.X-ABADR:us
BDAY;value=date:2001-07-06
X-ABShowAs:COMPANY
X-ABUID:5F7349CB-369F-4EAC-AB65-49ED902BEF9F\:ABPerson
END:VCARD

来自地址簿的非名片来源
BEGIN:VCARD
VERSION:3.0
N:;The Flow Skatepark;;;
FN:The Flow Skatepark
item1.TEL;type=pref:(614) 864-1610
item1.X-ABLabel:Work #
item2.ADR;type=WORK;type=pref:;;4252 Groves Rd;Columbus;OH;43232;USA
item2.X-ABADR:us
BDAY;value=date:2001-07-06
X-ABUID:5F7349CB-369F-4EAC-AB65-49ED902BEF9F\:ABPerson
END:VCARD

显然,这些代码示例有两个主要区别:
  • ORG:Flow 滑板公园;
  • X-ABSShowAs:COMPANY

  • 然而,我不知道这如何转化为 Vpim。

    最佳答案

    快速而肮脏的实现,我希望我能正确理解你:

    require 'vpim/vcard'
    
    vcards = <<VCARD
    BEGIN:VCARD
    VERSION:3.0
    N:;;;;
    FN:The Flow Skatepark
    ORG:The Flow Skatepark;
    item1.TEL;type=pref:(614) 864-1610
    item1.X-ABLabel:Work #
    item2.ADR;type=WORK;type=pref:;;4252 Groves Rd;Columbus;OH;43232;USA
    item2.X-ABADR:us
    BDAY;value=date:2001-07-06
    X-ABShowAs:COMPANY
    X-ABUID:5F7349CB-369F-4EAC-AB65-49ED902BEF9F\:ABPerson
    END:VCARD
    BEGIN:VCARD
    VERSION:3.0
    N:;The Flow Skatepark;;;
    FN:The Flow Skatepark
    item1.TEL;type=pref:(614) 864-1610
    item1.X-ABLabel:Work #
    item2.ADR;type=WORK;type=pref:;;4252 Groves Rd;Columbus;OH;43232;USA
    item2.X-ABADR:us
    BDAY;value=date:2001-07-06
    X-ABUID:5F7349CB-369F-4EAC-AB65-49ED902BEF9F\:ABPerson
    END:VCARD
    VCARD
    
    contacts = []
    Vpim::Vcard.decode(vcards).each do |vcard|
      contacts << {
        first_name:        vcard.name      ? vcard.name.given         : '',
        last_name:         vcard.name      ? vcard.name.family        : '',
        organisation_name: vcard.org       ? vcard.org.first          : '',
      }
    end
    
    def to_vcard(card)
      Vpim::Vcard::Maker.make2 do |maker|
        maker.add_name do |name|
          name.given = card[:first_name] unless card[:first_name].empty? || card[:first_name].nil?
          name.family = card[:last_name] unless card[:last_name].empty?  || card[:last_name].nil?
        end
        maker.org = card[:organisation_name] unless card[:organisation_name].empty? || card[:organisation_name].nil?
      end
    end
    
    contacts.each_with_index do |contact, idx|
      File.open("contact#{idx}.vcf", 'w') {|f| f.write(to_vcard(contact)) }
    end
    

    关于ruby-on-rails - 使用 Vpim Gem 创建公司卡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6561061/

    10-13 04:46