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

时间:2012-07-19 10:01:15

标签: ruby-on-rails-3

如何从头开始设置控制器/响应对象以运行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来设置响应对象似乎很尴尬。

如何设置控制器和响应对象来实现此目的?

1 个答案:

答案 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

一对夫妇注意到:

  • “perform”方法不带参数;继承自 struct允许我们将参数传递给GeneratePdfJob对象,以及它 设置一个名为“foo_id”的局部变量,我们可以在其中使用 “执行”方法。
  • 您的视图需要引用局部变量 “foo”而不是实例变量“@foo”。