0

如何从头开始设置控制器/响应对象以运行 render_to_string?

我开发了一个生成 PDF 文件的应用程序。我使用erb基于模板生成TeX文件,然后将其处理以转换为 PDF。

它工作正常,但我现在开始认为在后台生成报告会更好。因此,我创建了一个排队系统delayed_job,它运行良好。

现在,当结合其中两个时,我意识到渲染器是作为控制器的一部分实现的。

我想要做的是运行 render_to_string 来生成 PDF。看起来我需要从头开始设置控制器和响应对象。

我发现了一个与此相关的问题(如何从 Rails 的控制台调用控制器/视图方法?),但是通过调用设置响应对象post似乎很尴尬。

我如何设置控制器和响应对象来实现这一点?

4

1 回答 1

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

几点注意事项:

  • “执行”方法不带参数;从结构继承让我们将参数传递给 GeneratePdfJob 对象,它设置了一个名为“foo_id”的局部变量,我们可以在“perform”方法中使用它。
  • 您的视图需要引用局部变量“foo”而不是实例变量“@foo”。
于 2012-10-03T03:47:06.507 回答