Как я могу показать новый файл / веб-страницу, используя ActiveJob в Rails 5? - PullRequest
0 голосов
/ 03 июня 2018

Я использовал для создания 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 для отображения файла, каким образом после того, как он был сгенерирован для пользователя?

...