2013-05-13 28 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发票而无需等待响应。

我想我不必担心服务器过度充电,因为请求会正常排队。