2

我在我的项目中添加了导入日历(ics 文件)的功能。代码是这样的:

  events = ICS::Event.file(File.open(ics_temp_file))
  events.each do |event|
    if event.summary and event.started_on and event.description
      Event.create(:description => event.description == '\n' ? nil : event.description,
                   :organization_id => @organization.id,
                   :user_id => current_user.id,
                   :event_type => Event::OTHER,
                   :date_time => event.started_on,
                   :title => event.summary,
                   :active => true)
    else
      logger.warn("***Error*** Importing ics (bad event)")
    end
  end

正如我们所看到的,我正在使用 gem ics。几个月前我进行了研究,它看起来是解析 ics 文件的最佳选择,即提取 ics 文件的事件。这个 gem 可以提取这样的事件:

BEGIN:VEVENT
something here
END:VEVENT.

问题如下;一些用户尝试导入日历(我不知道他们使用什么工具来创建日历),但事件是这样的:

BEGIN:VFREEBUSY
something here
END:VFREEBUSY.

所以问题是,你知道解析 ics 文件的更好选择吗?也许可以提取所有类型的事件,您可以执行 events.map(&:vevents) 或 events.map(&:vfreebusy) 之类的操作。你有什么想法来处理这个吗?谢谢!

编辑:对不起,我忘了提到这个宝石的已知属性列表是这样的

    TRANSP
    DTEND
    UID
    DTSTAMP
    LOCATION
    DESCRIPTION
    URL
    STATUS
    SEQUENCE
    SUMMARY
    DTSTART
    CREATED
# For the alarm…
    # BEGIN:VALARM (ignored)
    X-WR-ALARMUID
    TRIGGER
    ATTACH
    ACTION
    # END:VALARM (ignored)

因此很容易看出为什么这个 gem 没有提取所有类型的事件。

4

1 回答 1

4

您应该尝试 iCalendar:https ://github.com/sdague/icalendar 。它解析 ics 文件并支持您提到的事件类型:https ://github.com/sdague/icalendar/blob/master/lib/icalendar/parser.rb#L139 。

于 2012-09-17T09:19:42.570 回答