Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate CSV file from rails

I've been reading similar questions, but many of the answers are outdated or not clear enough for me.

I'd like to be able to just do something like (in a controller action):

respond_to do |format|
  format.html
  format.csv
end

I know I'd then need a view such as action.csv.erb


So my questions are:

1) What do I need to configure in rails to allow this to happen in general.

2) How should I setup the CSV view to display some basic fields from a model?

UPDATE:

So I've tried to go the route of comma, I installed and vendored the gem.

Then according to the read me, I threw this into my model (customized to my needs):

comma do

user_id 'User'
created_at 'Date'
name 'Name'
end

I then threw this in the control for the index action (according to the readme):

  format.csv { render :csv => MyModel.limited(50) }

Then when accessing the index (not in CSV format) I receive the following ActionController Exception error:

undefined method `comma' for

So then I googled that, and I read that I should put require 'comma' in my model.

After doing that, I refreshed (my local index page), and the error changed to:

no such file to load -- comma

So at this point I decided it must not be finding the comma files obviously. So I copied the files from the vendored gem folder of comma, from comma's lib folder, to the rails lib folder. I then refreshed the page and landed on this error:

uninitialized constant Error

Then I pretty much gave up.

The errors from the trace were:

/Users/elliot/.gem/ruby/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:443:in load_missing_constant' /Users/elliot/.gem/ruby/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:80:in const_missing' /Users/elliot/.gem/ruby/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:92:in `const_missing'

Other notes, I have already installed FasterCSV

Hope thats enough info :)

like image 266
Elliot Avatar asked Mar 18 '10 19:03

Elliot


2 Answers

I suggest taking a look at comma. It works very well and allows you to handle stuff at the model level, as opposed to the view level.

like image 198
theIV Avatar answered Oct 07 '22 20:10

theIV


Have a look at FasterCSV.

csv_string = FasterCSV.generate do |csv|

  cols = ["column one", "column two", "column three"]

  csv << cols

  @entries.each do |entry|                
    csv << [entry.column_one, entry.column_two, entry.column_three ]
  end

  filename = "data-#{Time.now.to_date.to_s}.csv"    

end

send_data(csv_string, :type => 'text/csv; charset=utf-8; header=present', :filename => filename)  
like image 40
Toby Hede Avatar answered Oct 07 '22 20:10

Toby Hede