1

我正在使用 rails 3.0 和 PDFKit。SASS 和 HAML,但我还没有实现资产管道。

如果我从控制器拨打电话,我可以生成带有图像的完美风格的 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

耙任务版本

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_taghelper 和stylesheet_link_taghelper抛出相同的错误

另一种方法是在 rake 任务中实例化控制器,但是..有可能吗?而且,这是一个好习惯吗?

4

1 回答 1

1

我找不到任何体面的解决方案,但我尝试了以下技术:

  • 又快又脏

使用文件的绝对路径,使用 HAML 标签%link%img不是助手更改视图。

  • 缓慢但优雅

在rake任务中,调用controller接收view url,以这种方式交给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 发票,而无需等待响应。

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

于 2013-05-14T14:33:13.017 回答