Как я могу скачать несколько файлов.xlsx, используя axlsx gem?

Привет у меня проблемы с загрузкой нескольких файлов с Axlsx. Проблема в том, что я отправляю массив идентификаторов на контроллер и прошу его загрузить отчет с помощью команды рендеринга. Это вызывает 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

1 ответ

Это встроенное ожидание Rails, которое вы вызываете render один раз за запрос. И браузер будет ожидать один ответ на запрос. Итак, вам придется делать что-то еще!

Ты можешь использовать 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, так что вы должны иметь его уже. И вы, вероятно, захотите найти каждого пользователя и использовать его имя для электронной таблицы, если только у вас его нет.

Другие вопросы по тегам