In one of our applications, as a feature, I had to allow users to export
certain data to a CSV file, I can show you, this is what I do
The first solution that came to my mind was to add it a 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.
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 this.
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 file.