0

render_to_string を実行するために、コントローラー/応答オブジェクトを最初からセットアップするにはどうすればよいですか?

PDFファイルを生成するアプリケーションを開発しました。erbベースのテンプレートを使用してTeXファイルを生成し、それを処理して PDF に変換しました。

正常に動作していますが、バックグラウンドでレポートを生成する方がよいと考え始めています。そこで、 を使用してキューイング システムを作成しましたが、delayed_jobうまく機能しています。

さて、2つを組み合わせると、レンダラーがコントローラーの一部として実装されていることに気付きました。

私がやりたいことは、render_to_string を実行して PDF を生成することです。コントローラーと応答オブジェクトを最初からセットアップする必要があるようです。

これに関連する質問 (Rails のコンソールからコントローラー/ビュー メソッドを呼び出すにはどうすればよいですか?)を見つけましたが、呼び出しによって応答オブジェクトを設定するのpostは厄介なようです。

これを達成するためにコントローラーと応答オブジェクトをセットアップするにはどうすればよいですか?

4

1 に答える 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」というローカル変数が設定されます。
  • ビューは、インスタンス変数「@foo」ではなく、ローカル変数「foo」を参照する必要があります。
于 2012-10-03T03:47:06.507 に答える