Ich habe eine Funktion in einem Controller, der einige Spezifikationen übernimmt und einen Bericht über sie generiert. Diese Funktion user_report wird in einer Sicht aufgerufen:Schwierigkeit mit send_data in Ruby on Rails in Verbindung mit Tabellenkalkulations-Plugin
<% = submit_to_remote 'Senden-Schaltfläche', "Bericht nach Excel exportieren",: url => {: controller =>: reports,: action =>: user_report,: print_state => 'print'}%>
In reports_controller verwende ich das Spreadsheet-Plugin, um eine Excel-Datei innerhalb der User_report-Funktion zu generieren. Ich möchte send_data verwenden, um die Datei an den Benutzer zu streamen, ohne sie zuerst auf dem Server zu erstellen. Die Recherche, die ich durchgeführt habe, zeigt, dass die Verwendung von StringIO der richtige Weg ist, wie unten gezeigt. Frustrierend passiert nichts, wenn ich send_data anrufe. Das Plugin scheint gut zu funktionieren, eine Datei zu erstellen und sie auf dem Server zu speichern, tut aber nichts, wenn ich send_file benutze, was darauf hindeutet, dass das Problem nicht im Plugin liegt. Aber was mache ich falsch mit send_file/send_data?
Die Funktion selbst sieht wie folgt aus:
def
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
Ende
Die Log-Datei liest 2010-10-18 14.13 user_report : 59 INFO - Daten senden Report_for_jjohnson.xls , aber kein Download beginnt im Browser. Es ist mir gelungen, send_data für diese App vorher zu verwenden, was verwirrend ist.
Ich verwende Rails v2.3, Ruby v1.8.7, und Spreadsheet v6.4.1 bei Spreadsheet.rubyforge.org.
Dies ist eine alte Frage ... Aber ich habe den Drang, zu bemerken, dass 'data.string.force_encoding (‚binary‘)' funktioniert für mich und sieht ein bisschen besser. – scaryzet