如何从头开始设置控制器/响应对象以运行render_to_string?
我开发了一个生成PDF文件的应用程序。
我使用基于erb
的模板生成TeX
文件,然后处理它以转换为PDF。
它工作正常,但我现在开始认为最好在后台生成报告。因此,我使用delayed_job
创建了一个排队系统,并且运行良好。
现在,当结合其中两个时,我意识到渲染器是作为控制器的一部分实现的。
我想要做的是运行render_to_string来生成PDF。看起来我需要从头开始设置控制器和响应对象。
我发现a question (How do I call controller/view methods from the console in Rails?)与此相关,但通过调用post
来设置响应对象似乎很尴尬。
如何设置控制器和响应对象来实现此目的?
答案 0 :(得分:1)
这是一种方法(通过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
一对夫妇注意到: