Я использовал для создания PDF-файлов для своих пользователей, используя гем wicked_pdf
и написав что-то вроде приведенного ниже примера кода:
class ThingsController < ApplicationController
def show
respond_to do |format|
format.html
format.pdf do
render pdf: "file_name" # Excluding ".pdf" extension.
end
end
end
end
Я бы тогда имел ссылку на страницу типа <%= link_to report_pdf_path(@report), "Download PDF", target: "_blank" %>
, котораяприведет к тому, что PDF будет отображаться в браузере пользователя в качестве новой вкладки.Это предпочтительное поведение, которое я хотел бы, но оно останавливает все запросы до тех пор, пока PDF-файл не будет завершен для пользователя, а некоторые из них занимают довольно много времени для генерации.ActiveJob, который работает хорошо, но я не могу понять, как ActiveJob открыть файл в новом окне.В настоящее время у меня есть запись на сервер, а затем обновление части, которая показывает файлы, запрошенные пользователем.Ниже приведен пример этого.
class GeneratePdfJob < ApplicationJob
queue_as :default
def perform(*args)
params = args.first
generate_pdf_document(params)
end
def generate_pdf_document(params)
html = ApplicationController.new.render_to_string(
template: 'players/board_labels.pdf.erb',
locals: { player_ids: params[:player_ids] }
)
save_to_pdf(html, params[:pdf_title], params[:user_code])
end
def save_to_pdf(html, pdf_title, user_code)
pdf = WickedPdf.new.pdf_from_string(
html,
pdf: "#{pdf_title}",
layout: 'print',
encoding: 'utf-8'
)
pdf_name = "#{pdf_title}.pdf"
pdf_dir = Rails.root.join('public','uploads','reports',"#{user_code}")
pdf_path = Rails.root.join(pdf_dir,pdf_name)
# create the folder if it doesn't exist
FileUtils.mkdir_p(pdf_dir) unless File.directory?(pdf_dir)
# create a new file
File.open(pdf_path,'wb') do |file|
file.binmode
file << pdf.force_encoding("UTF-8")
end
end
end
Итак, как я могу создать метод, который заменит метод save_to_pdf
и вместо этого откроет файл на новой вкладке для пользователя?Если это невозможно, могу ли я открыть вкладку при запуске ActiveJob, которая является вкладкой-заполнителем, а затем включить ActionCable для отображения файла, каким образом после того, как он был сгенерирован для пользователя?