您好我在使用axlsx下载多个文件时遇到问题。问题是我向控制器发送了一组Id,并要求它使用render命令下载报告。它引发了一个AbstractController :: DoubleRenderError。我想要克服错误,但意识到这是一个坏主意,我不知道还能做什么...有什么建议吗?感谢。
我的控制器代码如下所示:
def download_report
params[:user_id].each do |user_id|
@report = Report.find_by(:user_id => user_id)
render :xlsx => "download_report", :filename => "#{@report.user.last_name}.xlsx"
end
end
我的axlsx模板:
wb = xlsx_package.workbook
wb.add_worksheet(name: "Reports") do |sheet|
wb.styles do |s|
# template code
end
end
答案 0 :(得分:0)
这是Rails的内置期望,你可以根据请求调用一次渲染。并且,浏览器预计每个请求会有一个响应。所以,你将不得不做别的事情!
您可以使用render_to_string
,并将结果合并到一个zip文件中。请参阅此回复的底部。
或者,您可以创建一个电子表格,并让每个用户的报告显示在他们自己的工作表上。
或者,在客户端,您可以使用javascript来请求每个电子表格并单独下载每个电子表格。
zip就像这段代码一样,它使用render_to_string
,rubyzip
和send_data
:
def download_report
compressed_filestream = Zip::ZipOutputStream.write_buffer do |zos|
params[:user_id].each do |user_id|
@report = Report.find_by(:user_id => user_id)
content = render_to_string :xlsx => "download_report", :filename => "#{@report.user.last_name}.xlsx"
zos.put_next_entry("user_#{user_id}.xlsx")
zos.print content
end
end
compressed_filestream.rewind
send_data compressed_filestream.read, :filename => 'download_report.zip', :type => "application/zip"
end
Axlsx需要rubyzip,所以你应该已经拥有它。您可能希望查找每个用户并使用他们的名称作为电子表格,除非您另有说明。