Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

All day event icalendar gem

I am using the below to setup an event to export to ical with the icalendar gem.

@calendar = Icalendar::Calendar.new

event = Icalendar::Event.new
event.dtstart = ev.start_at.strftime("%Y%m%d")
event.dtend = ev.end_at.strftime("%Y%m%d")
event.summary = ev.summary

@calendar.add

In order to make an event all day it needs to look like this:

DTSTART;VALUE=DATE:20101117
DTEND;VALUE=DATE:20101119

Right now I am using

event.dtstart = "$VALUE=DATE:"+ev.start_at.strftime("%Y%m%d")"

This will output

DTSTART:$VALUE=DATE:20101117

and then I replace all ":$" with ";" with

@allday = @calendar.to_ical.gsub(":$", ";")

Is there a more direct way to save dates as all day?

like image 713
fchasen Avatar asked Dec 19 '25 04:12

fchasen


1 Answers

I played around with this and figured out one way. You can assign properties to the event dates, in the form of key-value pairs. so you could assign the VALUE property like so:

event = Icalendar::Event.new
event.dtstart = Date.new(2010,12,1)
event.dtstart.ical_params = { "VALUE" => "DATE" }
puts event.to_ical

# output
BEGIN:VEVENT
DTSTAMP:20101201T230134
DTSTART;VALUE=DATE:20101201
SEQUENCE:0
UID:2010-12-01T23:01:34-08:00_923426206@ubuntu
END:VEVENT

Now the fun part. Given a calendar you can create an event and pass in a block which initializes the date with its properties:

calendar.event do
  dtstart Date.new(2010,11,17), ical_params = {"VALUE"=>"DATE"}
  dtend Date.new(2010,11,19), ical_params = {"VALUE"=>"DATE"}
end
like image 181
zetetic Avatar answered Dec 21 '25 00:12

zetetic