0

嗨,我在使用 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
4

1 回答 1

0

这是 Rails 的内置预期,您将在每个请求中调用一次 render。而且,浏览器会期望每个请求有一个响应。所以,你将不得不做其他事情!

您可以使用render_to_string,并将结果合并到一个 zip 文件中,以提供服务。请参阅此回复的底部。

或者,您可以创建一个电子表格,让每个用户的报告显示在他们自己的工作表上。

或者,在客户端,您可以使用 javascript 请求每个电子表格并分别下载每个电子表格。

zip 类似于此代码,它使用render_to_stringrubyzipsend_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 需要 ruby​​zip,所以你应该已经有了它。而且您可能希望查找每个用户并将他们的姓名用于电子表格,除非您另有规定。

于 2014-08-27T22:12:39.023 回答