Rails tem send_data
e send_file
. O último trabalha com blobs de dados e o primeiro trabalha com arquivos no servidor. Blobs de dados só funcionam se você já tiver isso na memória e divisão de arquivos quando você tiver vários servidores. E se você quiser transmitir para o navegador enquanto lê do banco de dados?
Você pode criar um objeto streamer para entregar dados conforme você os busca no banco de dados. Você só precisa definir o corpo da resposta para um objeto para o qual a resposta each
.
Coloque isso em seu controlador:
def download
report = StoredReport.first
headers["Content-Type"] = "text/csv"
headers["Content-disposition"] = "attachment; filename=test.csv"
self.response_body = StoredReportStreamer.new(report)
end
Certifique-se de incluir o material do cabeçalho para marcá-lo como o tipo correto e como um download.
Então, para o objeto streamer, use isto:
class StoredReportStreamer
attr_accessor :report
def initialize(report)
self.report = report
end
def each
report.rows.each do |row|
yield row
end
end
end
Isso produzirá cada linha do relatório para o navegador.
Obrigado a esta postagem no blog pela dica: http://blog.sparqcode.com/2012/02/04/streaming-data-with-rails-3-1-or-3-2/