Generating an iCalendar feed from a controller in Ruby on Rails

Posted on December 11th, 2007 in Nerdy,ruby,ruby on rails by toholio

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

4 Responses to 'Generating an iCalendar feed from a controller in Ruby on Rails'

Subscribe to comments with RSS or TrackBack to 'Generating an iCalendar feed from a controller in Ruby on Rails'.

  1. Oren said,

    on December 31st, 2007 at 9:17 am

    does anyone know how to generate an iCal feeder with C#?

  2. vinay said,

    on June 23rd, 2008 at 4:55 am

    can ics be sent via mail?

  3. Chap said,

    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?

  4. Dave said,

    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’

Post a comment