Responding to CSV in Rails 3 with comma

Herman MorenoMar 06, 2012

In one of our applications, as a feature, I had to allow users to export certain data to a CSV file.

The first solution that came to my mind was to add a CSV responder at the controller, that way Rails should take care of the rest for me, or so I thought.

class JobsController < ApplicationController
  respond_to :csv

  def index
    @jobs = Job.confirmed
    respond_with @jobs
  end
end

However, if you browse to '/jobs.csv' in your browser, you get a missing template error, this is because Rails can only render json, xml, and js by default.

If we need to respond with another MIME type, we need to add a custom renderer, or, use a gem like comma.

COMMA

From it's README:

When used with Rails (ie. add 'comma' as a gem dependency), Comma automatically adds support for rendering CSV output in your controllers:

So, now all we need to do is add comma to our Gemfile:

gem 'comma', '~> 3.0'

And in our model define a comma block with the desired structure for the CSV.

class Job < ActiveRecord::Base
  belongs_to :service

  comma do
    name
    scheduled_at
        ...
  end
end

Even if we need to include association attributes:

class Job < ActiveRecord::Base
  belongs_to :service

  comma do
    name
    scheduled_at
    service :name
    ...
  end
end

And that's it! now you can browse to '/jobs.csv' in your browser and you will get your CSV file.

blog comments powered byDisqus