如何在rails 5中使用wicked_pdf生成pdf并将其保存在activestorage中?

Got*_*tey 6 wicked-pdf rails-activejob ruby-on-rails-5

使用 Rails 5.2.4,我尝试在后台(在作业内)生成 pdf,然后将其附加到模型,如下所示:

pdf_contents = ApplicationController.render(
pdf: "name",
template: 'mytemplate.html.erb',
layout: 'pdf_layout.html',
disposition: 'attachment'
)

@user.attach(io: StringIO.new(pdf_contents), filename: "file.pdf", content_type: "application/pdf")
Run Code Online (Sandbox Code Playgroud)

但我得到:

WARN: ActionView::Template::Error: private method `format' called for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

使用

gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
Run Code Online (Sandbox Code Playgroud)

Sin*_*nal 2

以下解决方案适用于我的情况。

# frozen_string_literal: true

class OrderPdfJob < ApplicationJob
  queue_as :default

  def perform(order_id)
    order = Order.find(order_id)

    # include helpers
    action_controller = ActionController::Base.new
    action_controller.view_context_class.include(ActionView::Helpers, ApplicationHelper)

    pdf = WickedPdf.new.pdf_from_string(
      action_controller.render_to_string(
        "order_pdf/summary", layout: 'pdf', locals: { order: order }
      )
    )

    # in your order model should have 'has_one_attached :summary' 
    order.summary.attach(
      io: StringIO.new(pdf),
      filename: "#{order.id}.pdf",
      content_type: 'application/pdf'
    )
    order.save!
  end
end
Run Code Online (Sandbox Code Playgroud)