2012-07-19 51 views
0

如何從頭開始設置控制器/響應對象以運行render_to_string?如何從頭開始設置控制器/響應對象以運行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

這裏有一個辦法做到這一點(產生通過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」。
+0

謝謝。從ActionView :: Base開始的三行代碼就是我需要的代碼! – shigeya 2012-10-03 23:51:04

相關問題