这是一种方法(通过wicked_pdf生成 PDF ):
控制器:
class FoosController < ApplicationController
def queue_pdf_generation
@foo = Foo.find(params[:id])
Delayed::Job.enqueue GeneratePdfJob.new(@foo.id)
end
end
延迟工作:
class GeneratePdfJob < Struct.new(:foo_id)
def perform
# get the Foo object when the job is run
foo = Foo.find(foo_id)
# create an instance of ActionView, so we can use render method outside of a controller
av = ActionView::Base.new()
av.view_paths = ActionController::Base.view_paths
pdf_html = av.render :template => "foos/pdf.html.erb", :layout => nil, :locals => {:foo => foo}
# use wicked_pdf gem to create PDF from the foo HTML
foo_pdf = WickedPdf.new.pdf_from_string(pdf_html, :page_size => 'Letter')
# save PDF to disk
pdf_path = Rails.root.join('tmp', "#{foo.id}.pdf")
File.open(pdf_path, 'wb') do |file|
file << foo_pdf
end
end
几点注意事项:
- “执行”方法不带参数;从结构继承让我们将参数传递给 GeneratePdfJob 对象,它设置了一个名为“foo_id”的局部变量,我们可以在“perform”方法中使用它。
- 您的视图需要引用局部变量“foo”而不是实例变量“@foo”。