2013-05-13 27 views
1

我正在使用rails 3.0和PDFKit。 SASS和HAML,但我還沒有實施資產管道。Rails 3.0 PDFKit,包含資產和image_tag生成PDF時產生一個耙子任務

如果我從控制器撥打電話,我可以生成帶圖像的完美樣式的PDF,並調用PDFKit.new傳遞render_to_string:show。 但是,如果我通過一個rake任務做的一樣,在沒有產生款式我的PDF和IMAGE_TAG幫手拋出這樣的錯誤:

can't convert nil into String

當然,我做錯了什麼在rake任務。 ..但一切在控制器中工作...我失蹤了什麼? 我應該在rake任務中包含一些東西嗎?或者可能使用其他視圖與內聯樣式和絕對路徑? 調用是這些:

控制器版本

def generate_html_invoice 
    render_to_string :show, layout: 'mypdflayout' 
end 

mypdf = PDFKit.new html_generator 

Rake任務VERSION

def generate_html_invoice 
    invoice_view = ActionView::Base.new(MyWeb::Application.config.paths["app/views"].first) 
    invoice_view.assign({ ....... various params here}) 
    html_invoice = invoice_view.render(template: "invoices/show", layout: 'mypdflayout') 
return html_invoice 

mypdf = PDFKit.new html_generator 

同樣的錯誤是由image_tag助手和stylesheet_link_tag幫手拋出

的另一種方式可能是實例化在rake任務中的控制器,但..有可能嗎?這是一個很好的做法嗎?

回答

1

我無法找到任何像樣的解決方案,這一點,但我嘗試以下方法:

  • 快速和骯髒的

改變使用%link%img HAML標籤,而不是助手的觀點,使用絕對文件路徑。

  • 緩慢而優雅

在rake任務,調用控制器接收查看網址,並給它PDFKit這樣

url = "#{(Rails.env.production? ? 'http://www.example.com' : 'http://localhost')}/invoce/#{invoice.id}" 
path_to_pdf = "root/......./mypdf.pdf" 
invoce_page = PDFKit.new url 
invoce_page.to_file(path_to_pdf) 

這一個是我選擇的解決方案。我知道,這有點愚蠢:控制器調用再次調用控制器的rake任務...並且它向服務器發出大量的http請求。 但通過這種方式,我可以通過地下過程生成PDF發票而無需等待響應。

我想我不必擔心服務器過度充電,因爲請求會正常排隊。