【问题标题】:How to extract parameter from icalendar event in Ruby?如何从 Ruby 中的 icalendar 事件中提取参数?
【发布时间】:2015-06-02 16:10:02
【问题描述】:

我对 Ruby 还很陌生,正在做一个小项目。我想从 iCalendar(*.ics 文件)事件中打印出一些详细信息。要处理 ics 文件,我使用 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

【问题讨论】:

  • 你在currentOnDuty对象中得到了什么?
  • currentOnDuty 是一组 Icalendar::Event 对象。因为我只需要一个事件,所以我使用 currentOnDuty.first。
  • 您是否介意尝试puts currentOnDuty.first.attendee.inspect 并分享输出。另外,试试puts currentOnDuty.first.attendee.cn
  • attendee.inspect 打印出[#&lt;URI::MailTo mailto:Jon.Doe@acme.com&gt;],attendee.cn 给我一个undefined method 'cn'
  • 另外两个建议:打印出...attendee.class 并尝试...attendee['cn']...attendee['CN']...attendee[:cn]

标签: ruby icalendar


【解决方案1】:

Icalendarvalues 包裹ical,这样:

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

这个类暴露了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"

希望对你有帮助。

【讨论】:

  • 这是最后的提示!非常感谢。
猜你喜欢
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 2012-10-25
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
相关资源
最近更新 更多