Yak shaving logs


My life is just yak shaving.

[Rails5] wicked_pdfを使用してPDFを生成した後にPDFをActive Storageで保存する

2018/05/25 #rails #gem #wicked_pdf #activestorage

あるアクションを行った時にその時点の情報でwicked_pdfを使用してPDFを生成して、Active StorageでPDFを保存する方法について書きました。

wicked_pdfの使い方はwicked_pdfを使用してHTMLをPDFに変換するに記載していますので、必要があればそちらも参考にしてください。

また、Active Storageの使い方については触れていませんので、Active Storage の概要を参考にしてください。

実装

保存処理のあとにPDFを生成&保存するメソッドを用意しました。
場合によっては生成と保存は分けてもいいかもしれませんね。

   def update
    @hoge = Hoge.find(params[:id]

     if @hoge.update(hoge_params)
+      create_hoge_pdf(@hoge)

privateメソッド内でも必要があれば親コントローラー内のメソッドにしても良いでしょう。

+  def create_hoge_pdf(hoge)
+    pdf = render_to_string pdf: "fuga_#{hoge.id}",
+                           layout:   'layouts/pdf.html.haml',
+                           template: 'shared/hoge.html.haml'
+    hoge.fuga.attach io: StringIO.new(pdf), filename: 'hoge_fuga', content_type: 'application/pdf'
+    hoge.save!
+  end

PDFの表示は object タグを利用します。

+ %object.pdf{ data: url_for(@hoge.fuga) }

スタイルはレスポンシブなどまだ調整の必要があります。

+.pdf {
+  min-height: 800px;
+  width: 100%;
+}

これで完了です!

補足

  • render_to_string
    • render にすると render の後にコントローラー内で redirect_to をする関係で複数回レンダリングorリダイレクトしたらだめと怒られるので render_to_string を使います。
  • partial が使えないので template を使わざるを得なく、それにともない locales も使えないので必要なデータはインスタンス変数に入れておかないといけません・・・

参考

https://qiita.com/katzueno/items/c490361c3274d0108e7d
https://railsguides.jp/active_storage_overview.html#%E6%B7%BB%E4%BB%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%B8%E3%81%AE%E3%83%AA%E3%83%B3%E3%82%AF
https://qiita.com/kon_yu/items/62eceb2d36fbb51d4891
https://stackoverflow.com/questions/48268731/use-rails-5-2-activestorage-to-create-and-save-pdf-and-later-attach-to-email
https://github.com/mileszs/wicked_pdf#advanced-usage-with-all-available-options

このエントリーをはてなブックマークに追加

categories


最新記事


tags