2011-05-23 22 views
11

Visitar la páginaCrear archivo descargable en Ruby on Rails

localhost:3000/download_me 

llama a la acción del controlador download_me en foo controlador.

class foo < ApplicationController 
    def download_me 
    # a file is created here i.e. temp.csv in directory C:\ 
    end 
end 

El controlador deberá crear un archivo csv temporal y después de eso desencadenar una descarga en el navegador que está visitando la página.

¿Cómo puedo hacer eso?

Respuesta

15

¿Hay alguna razón por la que desee almacenar el archivo temporal en su servidor? Si es así algo como esto debería ser suficiente (usando fastercsv, que tendrá que instalar):

require 'fastercsv' 
FILE_PATH= "root/to/tmpfile.csv" 

FasterCSV.open(FILE_PATH, "w") do |csv| 
    csv << 'add some data' 
end 

send_file file_path, :type=>'text/csv' 

Te sugiero probable que no necesita almacenar el archivo, aunque por lo que sólo reemplazar la línea FasterCSV.open con:

csv = FasterCSV.generate do |csv| 

Entonces escupir el csv como la respuesta:

send_data csv, :type=> 'text/csv' 
+0

terminé usando 'send_data' en lugar de 'send_file' para esto. No sé si es necesario, pero debido a que tenía un flujo de datos en lugar de un archivo, no tuve que meterme con la E/S del disco, etc. – jaydel

+0

Probablemente sea lo mejor que puede hacer. Respuesta modificada para referencias futuras – Yule

+4

No necesita instalar FasterCSV en la mayoría de los casos. En ruby ​​1.9.2, el 'CSV' predeterminado es FasterCSV, en ruby ​​1.8.7 FasterCSV está incluido. – diedthreetimes