2017-09-06 5 views
1

は、私は、pdfファイルを生成します。before_saveコールバックのモデルアクションで生成した直後にPDFファイルをダウンロードできますか?お支払い方法は請求書であればモデルで

class Order < ApplicationRecord 
    require 'prawn' 

    after_save :generate_pdf 

    def generate_pdf 
     if payment_method.name == 'Invoice' 
     pdf = Prawn::Document.generate("public/pdf/invoice_#{SecureRandom.hex}_#{user.name}_№#{id}.pdf", 
           page_size: [200, 500], 
           page_layout: :landscape, 
           margin: 10) do |pdf| 
     pdf.text_box 'A test text', at: [0, 170] 
     end 
    end 
    end 
end 

このコードはpublic/pdfフォルダ内のPDFファイルを生成します。私が必要とするのは、世代の直後にファイルをダウンロードできることです。 send_dataが唯一のコントローラで動作することを、

send_data(filename: pdf, type: 'public/pdf') 

しかし、それはそうです:私はgenerate_pdf方法のpdfブロックの終了後にこの権利を追加し、ファイルをダウンロードしようとしました。では、モデルから何とかダウンロードする方法はありますか?先にありがとう。

答えて

1

モデルからファイルを送信することはできません。コントローラはモデルデータを応答に利用可能にします。コントローラーは、生成されたファイルをモデルから取得してユーザーに送信できる必要があります。

それはこのように実現することができます。

# controller 
class OrdersController < ApplicationController 

    def create 
    # ... 
    @order.save 
    send_data(@order.pdf.render, type: 'application/pdf') 
    end 
end 

# model 
require 'prawn' 

class Order < ApplicationRecord 
    attr_accessor :pdf 

    after_save :generate_pdf 

    def generate_pdf 
     if payment_method.name == 'Invoice' 
     pdf = Prawn::Document.generate("public/pdf/invoice_#{SecureRandom.hex}_#{user.name}_№#{id}.pdf", 
           page_size: [200, 500], 
           page_layout: :landscape, 
           margin: 10) do |pdf| 
     pdf.text_box 'A test text', at: [0, 170] 

     self.pdf = pdf 
     end 
    end 
    end 
end 
関連する問題