如何从 Ruby 中的 icalendar 事件中提取参数?

How to extract parameter from icalendar event in Ruby?

我是 Ruby 的新手,正在做一个小项目。我想打印出 iCalendar(*.ics 文件)事件的一些详细信息。为了处理 ics-File,我使用 icalendar gem.

到目前为止,我已经设法提取了正确的事件,但我还需要打印出与会者。我的问题:ATTENDEE 字段使用了多个参数。这是一个例子:

BEGIN:VEVENT
DTSTAMP:20150527T074021Z
DTSTART;VALUE=DATE:20150525
DTEND;VALUE=DATE:20150530
SUMMARY:OnCall Duty
UID:1234
DESCRIPTION:
CREATED:20150512T063102Z
LAST-MODIFIED:20150512T063102Z
ATTENDEE;X-MYUSER-KEY=dfdfdf;CN=Jon 
 Doe;CUTYPE=INDIVIDUAL:mailto:Jon.Doe@acme.com
SEQUENCE:1
X-CONFLUENCE-SUBCALENDAR-TYPE:other
TRANSP:TRANSPARENT
STATUS:CONFIRMED
END:VEVENT

目前我的代码是这样的:

require 'icalendar'
require 'active_support/all'
require 'open-uri'

ics_file  = File.open("ops.ics")
cal = Icalendar.parse(ics_file).first
events = cal.events

now = DateTime.now
currentOnDuty = events.select{ |e| e.summary == "OnCall Duty" && e.dtstart.to_time >= now.beginning_of_week && e.dtend.to_time <= now.end_of_week }

puts "User: #{currentOnDuty.first.attendee}"

创建以下输出:

[#<URI::MailTo Jon.Doe@acme.com>]

我更需要的是 ATTENDEE 的 "CN" 参数。所以我想得到输出:

User: Jon Doe

文档中只有几个使用参数创建事件的示例,但到目前为止我还不知道如何提取某个参数。

关于如何从 ATTENDEE 字段中提取 "CN" 参数的任何提示?


解决方案:

currentOnDuty.first.attendee.ical_params[:cn].first

Icalendarvalues 包装 ical,因此:

▶ cal.first.events.first.attendee.first.class
#⇒ Icalendar::Values::CalAddress < Icalendar::Values::Uri

此 class 已公开 ical_params 属性:

▶ cal.first.events.first.attendee.first.ical_params[:cn]
#⇒ [ [0] "John Doe" ]

所以(您可能想检查此属性是否存在):

▶ cal.first.events.first.attendee.first.ical_params[:cn].first
#⇒ "John Doe"

希望对您有所帮助。