Ror:导入ics文件

时间:2012-09-17 07:32:11

标签: ruby-on-rails ruby icalendar

我在项目中添加了导入日历(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

正如我们所看到的,我正在使用宝石。我在几个月前研究过,它看起来像是削减ics文件的最佳选择,即提取ics文件的事件。 这个gem可以提取这样的事件:

BEGIN:VEVENT
something here
END:VEVENT.

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

BEGIN:VFREEBUSY
something here
END:VFREEBUSY.

所以问题是,您是否知道解析ics文件的更好选择?也许某些东西可以提取所有类型的事件,你可以做类似的事情 events.map(&:vevents)或events.map(&:vfreebusy)。你有任何想法来处理这个问题吗?谢谢!

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

    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)

因此很容易理解为什么这个宝石没有提取各种事件。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

事实上,自上次使用它以来,gem icalendar已经改进了他的功能。现在我试过了:

require 'icalendar'

ics_file = File.open('../Descargas/basic.ics') # or whatever is the path to your calendar
cals = Icalendar.parse(ics_file)

cal = cals.first # you can have many calendars on a single ics file
events = cal.events + cal.freebusys + cal.todos + cal.journals

events.each do |event|
  if event.respond_to?('summary') and event.summary and event.respond_to?('dtstart') and event.dtstart # and so on with the attributes you require...
    Event.create(some attributes in here)
  end
end

真的很好。这个gem可以很好地解析ics文件。