1

Rails 3.0 と PDFKit を使用しています。SASS と HAML ですが、アセット パイプラインはまだ実装していません。

コントローラーから呼び出しを行うと、render_to_string :show を渡して PDFKit.new を呼び出し、画像を含む完全なスタイルの pdf を生成できます。しかし、rake タスクを使用して同じことを行うと、PDF はスタイルなしで生成され、image_tag ヘルパーは次のようなエラーをスローします。

can't convert nil into String

確かに、私はレーキタスクで何か間違ったことをしています...しかし、すべてがコントローラーで機能します...何が欠けていますか? rake タスクに何かを含める必要がありますか? それとも、インライン スタイルと絶対パスで別のビューを使用しますか? 呼び出しは次のとおりです。

コントローラーバージョン

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

mypdf = PDFKit.new html_generator

RAKE タスク バージョン

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 タスクでコントローラーをインスタンス化することですが、それは可能ですか? そして、それは良い習慣ですか?

4

1 に答える 1

1

これに対する適切な解決策は見つかりませんでしたが、次の手法を試しました。

  • クイックアンドダーティー

ファイルへの絶対パスを使用して、ヘルパーの代わりに HAML タグを使用%linkしてビューを変更します。%img

  • ゆっくりだがエレガント

rake タスクでは、コントローラーを呼び出してビューの 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 に答える