Generating an iCalendar feed from a controller in Ruby on Rails
Recently I needed to set-up an application to keep track of regular safety inspections for power tools and other equipment. The application is very trivial but my client was quite pleased with one particular feature which wasn’t actually requested.
The “bonus” feature was an iCalendar feed which allows the client to have his computers subscribe to the feed and keep up to date with what equipment needs inspecting and when. Very swish and, thanks to Rails and a nice gem, very easy.
So how’s it done? Easy!
Lets start by installing the icalendar gem. Open a terminal and install it as normal:
user@host railsapp$ gem install icalendar
Change to the vendor directory of your Rails application and unpack the gem:
user@host railsapp$ cd vendor/ user@host vendor$ gem unpack icalendar
Make sure it will be loaded by adding it to the end of config/environment.rb in your Rails application:
require 'icalendar-1.0.2/lib/icalendar'
Now we’re ready to add a calendar feed to our application. Lets say we have a table that contains the names and scheduled service dates of some tools. The client wants, or is going to get, a feed which marks each tool needing service in their calendar when their servicing is due.
Generating the iCalendar data is simple. The following method from tool_controller creates an event for each tool and inserts it into a calendar. The to_ical call at the end of the method get the calendar as a string which can be served to the user. Note that this method assumes the @tools variable has already been set (you could always add a call to Tool.find(:all) at the start of the method if needed).
def generate_ical cal = Icalendar::Calendar.new @tools.each do |tool| # create the event for this tool event = Icalendar::Event.new event.start = tool.inspection_date event.end = tool.inspection_date event.summary = "Service of " + tool.name + " is due." # insert the event into the calendar cal.add event end # return the calendar as a string cal.to_ical end
Next, we add the icalendar feed to respond_to in the tools_controller’s index method. We’ll make this call the generate_ical method to get the calendar data.
def index @tools = Tool.find(:all) respond_to do |format| format.html # index.html.erb format.xml { render :xml => @tools } format.ics { render :text => self.generate_ical } end end
And now you should be able to open your calendar application and subscribe to the feed straight from the tools controller using a URL like http://example.com/tools.ics
on December 31st, 2007 at 9:17 am
does anyone know how to generate an iCal feeder with C#?
on June 23rd, 2008 at 4:55 am
can ics be sent via mail?
on July 30th, 2008 at 6:03 am
I’m having a heck of a time getting this to work in a Rails 2.1 app.
Any thoughts?
on May 1st, 2009 at 1:08 pm
FYI for the time stamp create a helper in environment.rb with this format and use it to format your dates.
:us_icaldate => ‘%Y%m%dT%H%M%S’