2012-09-17 3 views
2

Я добавил в свой проект возможность импортировать календари (файлы ics). Код выглядит примерно так:Ror: Импорт файла 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. Этот камень может извлечь такие события:

BEGIN:VEVENT 
something here 
END:VEVENT. 

Проблема заключается в следующем; некоторые пользователи пытались импортировать календари (я не знаю, что инструмент, который они использовали для создания календаря), но события, как это:

BEGIN:VFREEBUSY 
something here 
END:VFREEBUSY. 

Так cuestion есть, вы знаете, лучшую альтернативу для разбора файлов 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) 

, следовательно, легко понять, почему этот камень не извлекая все виды событий.

+0

Aehm ... Я думаю, что в вашем посте есть опечатка ... или у меня еще нет кофе: «Проблема в том, что этот камень может извлекать такие события:», а затем «Проблема заключается в том, следующие: некоторые пользователи пытались импортировать календари (я не знаю, какой инструмент они использовали для создания календаря), но события такие: – Atastor

ответ

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 

Действительно хорошо. Этот драгоценный камень может отлично разбирать файлы ics.

Смежные вопросы