immaculate.pine
immaculate.pine

Reputation: 151

How can I save the response created by my Rails application?

There is CSV-export of some objects (such as tasks, contacts, etc) in my application. It just renders CSV-file like this:

respond_to do |format|
  format.html
  format.csv { render text: Task.to_csv } # I have self.to_csv def in model
end

It generates a CSV file when I go to '/tasks.csv' without a problem.

Now I want to export all the objects and zip them. I'm using rubyzip gem to create zip-files. Now my code for creating zip-file with all the CSVs looks like that:

Zip::ZipFile.open("#{path_to_file}.zip", Zip::ZipFile::CREATE) do |zipfile|
  zipfile.file.open("tasks.csv", "w") { |f| f << open("http://#{request.host}:#{request.port.to_s}/tasks.csv").read }
  # the same lines for contacts and other objects
end

But it seems that there is something wrong with it because it's executing for a long time (I'm getting Timeout::Error even if there is just one line in CSV) and the resulting zip-archive contains something broken.

How can I save my "/tasks.csv", "/contacts.csv", etc as a file on server (inside of zip-archive in this case)?

Upvotes: 2

Views: 465

Answers (1)

immaculate.pine
immaculate.pine

Reputation: 151

I did it! The code is:

Zip::ZipFile.open("#{path_to_file}.zip", Zip::ZipFile::CREATE) do |zipfile|

  zipfile.file.open("tasks.csv", "w") do |f| 
    CSV.open(f, "w") do |csv|
      CSV.parse(Task.to_csv) { |row| csv << row }
    end
  end

end

Upvotes: 1

Related Questions