2011-01-03 3 views
14

Je souhaite donner à mes utilisateurs la possibilité d'exporter une table au format CSV.Rails - Exportation CSV: demande de téléchargement de fichier

Donc, dans mon contrôleur, j'ai ajouté au-dessus du fichier:

respond_to :html, :js, :csv 

Je fixeraient également les en-têtes si le format est csv:

if params[:format] == 'csv' 
    generate_csv_headers("negotiations-#{Time.now.strftime("%Y%m%d")}") 
end 

Code pour generate_csv_headers (en application_controller) est:

def generate_csv_headers(filename) 
    headers.merge!({ 
     'Cache-Control'    => 'must-revalidate, post-check=0, pre-check=0', 
     'Content-Type'    => 'text/csv', 
     'Content-Disposition'  => "attachment; filename=\"#{filename}\"", 
     'Content-Transfer-Encoding' => 'binary' 
    }) 
    end 

J'ai aussi créé une vue nommée index.csv.erb pour générer mon fichier:

<%- headers = ["Id", "Name"] -%> 
<%= CSV.generate_line headers %> 
<%- @negotiations.each do |n| -%> 
<%- row = [ n.id, 
      n.name ] -%> 
<%= CSV.generate_line row %> 
<%- end -%> 

Je n'ai aucune erreur, mais il affiche simplement le contenu du fichier CSV, alors que je me attends à une invite du navigateur pour télécharger le fichier. J'ai beaucoup lu, mais je n'ai rien trouvé qui fonctionne. Avez-vous une idée?

merci, p.

+0

bonnes discussions sur ce sujet dans [ce fil SO] (http://stackoverflow.com/questions/94502/in-rails-how-to-return-records-as-a-csv -fichier) – zetetic

Répondre

10

Je ne sais toujours pas pourquoi cela a résolu le problème, mais il l'a fait.

J'ai changé le lien dans la vue de

<%= link_to "Export to csv", request.parameters.merge({:format => :csv})%> 

et il fonctionne maintenant!

0

Je ne suis pas sûr que vous deviez le faire de cette façon, mais si vous générez et enregistrez le fichier, vous pouvez utiliser send_file pour l'envoyer au navigateur. Voir http://api.rubyonrails.org/classes/ActionController/Streaming.html

+0

2 choses: Je génère des données à la volée et je suis sûr que je ne peux pas écrire de fichier (je suis sur Heroku). – Pierre

+2

Sendfile ne fonctionne pas sur Heroku. – Slick23

0

Vous pourriez être intéressé par cette gemme que j'ai faite appelée shaper CSV qui vous permet de créer une sortie CSV en utilisant un très joli Ruby DSL.

Il va également gérer la définition des en-têtes de réponse correctement, tout en permettant la personnalisation du nom de fichier.

https://github.com/paulspringett/csv_shaper

Questions connexes