J'ai une fonction dans un contrôleur qui accepte certaines spécifications et génère un rapport sur celles-ci. Cette fonction user_report est appelée dans une vue:Difficulté avec send_data dans Ruby on Rails en conjonction avec le plug-in Spreadsheet
<% = submit_to_remote 'submit-button', "Exporter le rapport vers Excel",: url => {: controller =>: reports,: action =>: user_report,: print_state => 'print'}%>
Dans reports_controller, j'utilise le plugin Spreadsheet pour générer un fichier Excel dans la fonction user_report. Je veux utiliser send_data pour diffuser le fichier à l'utilisateur sans le créer d'abord sur le serveur. La recherche que j'ai faite montre que l'utilisation de StringIO est la voie à suivre, comme indiqué ci-dessous. Frustrant, rien ne se passe quand j'appelle send_data. Le plugin semble bien fonctionner en créant un fichier et en le sauvegardant sur le serveur, mais ne fait rien quand j'utilise send_file, suggérant que le problème ne réside pas dans le plugin. Mais alors, qu'est-ce que je fais de mal avec send_file/send_data?
La fonction elle-même ressemble à ceci:
def user_report
if request.post?
unless params[:reports][:userid].blank?
@userid=params[:reports][:userid]
end
if params[:print_state]=='print'
report = Spreadsheet::Workbook.new
info = report.create_worksheet :name => 'User Information'
info.row(1).push 'User ID', @userid
@outfile = "Report_for_#{@userid}.xls"
require 'stringio'
data = StringIO.new ''
report.write data
send_data data.string, :type=>"application/excel", :disposition=>'attachment', :filename => @outfile
end
respond_to do |format|
format.js { }
end
end
fin
Le fichier journal lit 2010-10-18 14:13 : 59 INFO - Envoi de données Report_for_jjohnson.xls mais aucun téléchargement ne commence dans le navigateur. J'ai réussi à utiliser send_data sur cette application avant, ce qui est source de confusion. J'utilise Rails v2.3, Ruby v1.8.7 et Spreadsheet v6.4.1 sur spreadsheet.rubyforge.org.
Ceci est une vieille question ... Mais j'ai une envie de remarquer que 'data.string.force_encoding (« binaire »)' travaille pour moi et regarde un peu mieux. – scaryzet