這裏有一個辦法做到這一點(產生通過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
一對夫婦的注意事項:
- 「表演」見面了hod不帶參數;繼承自 結構讓我們可以將參數傳遞給GeneratePdfJob對象,並且它會設置一個名爲「foo_id」的本地變量,我們可以在 「perform」方法中使用該變量。
- 您的視圖需要引用局部變量 「foo」而不是實例變量「@foo」。
謝謝。從ActionView :: Base開始的三行代碼就是我需要的代碼! – shigeya 2012-10-03 23:51:04