2011-07-05 1 views
5

J'ai configuré un type MIME personnalisé:CSV rend en vue Safari, mais je le veux télécharger un fichier

ActionController::Renderers.add :csv do |csv, options| 
    self.content_type ||= Mime::CSV 
    self.response_body = csv.respond_to?(:to_csv) ? csv.to_csv : csv 
end 

et un bloc respond_to dans mon contrôleur:

respond_to do |format| 
    format.html 
    format.csv { render :csv => csv_code} 
    end 

Utiliser Firefox et Chrome , le fichier .csv renvoie vers un fichier qui est téléchargé. En utilisant Safari, le .csv est rendu en tant que vue: Comment puis-je changer cela et le forcer à télécharger en tant que fichier?

Voir une capture d'écran du problème:

enter image description here

Répondre

9

Essayez

respond_to do |format| 
    format.html 
    format.csv do 
     response.headers['Content-Type'] = 'text/csv' 
     response.headers['Content-Disposition'] = 'attachment; filename=thefile.csv'  
     render :csv => csv_code 
    end 
end 

si cela ne fonctionne pas, essayez d'utiliser

send_file "path/to/file.csv", :disposition => "attachment" 
+0

Merci. Les méthodes response.headers fonctionnent très bien. –

0

La façon dont j'ai cette travailler dans une vieille application Rails 2 utilise send_data au lieu de render dans le contrôleur. E.g .:

def csv 
    ... # build data 
    send_data csv_data_as_string, :filename => "#{filename}.csv", :type => 'text/csv' 
end 
Questions connexes