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