2016-12-22 2 views
0

私のレールアプリでは、他のデバイスから注文の詳細を受け取り、pdfを生成してAWSにアップロードするAPIを作成しています.wicked_pdf gemを使用してpdfを生成していますaws-sdkはAwsにデータをアップロードします。コントローラのコードは以下の通りです。wicked pdf gemを使用している間にレンダリングエラーがダブル

def order_invoice 
    response = Hash.new 
    result = Hash.new 
    if params[:order] && params[:order][:txnid] && 
    params[:no_of_copies] && params[:order][:total_amount]!= 0 
    @order = params[:order] 
       ... 
    @no_of_copies = params[:no_of_copies] 
    invoice = create_pdf 
    response['result'] = invoice 
    response.merge! ApiStatusList::OK 
    else 
    response.merge! ApiStatusList::INVALID_REQUEST 
    end 
    render :json => response 
end 

def create_pdf 
    pdf = WickedPdf.new.pdf_from_string(
      render_to_string(template: 'invoices/generate_invoice.pdf.erb')) 

    send_data(pdf, filename: params[:order][:txnid] + ".pdf" , 
       type: 'application/pdf', 
       disposition: 'attachment', print_media_type: true) 
    save_path = Rails.root.join('pdfs', @order['txnid'] + ".pdf") 
    File.open(save_path, 'wb') do |file| 
    file << pdf 
    filename = @order['txnid'] + ".pdf" 
    end 
    file_name = @order['txnid'] + ".pdf" 
    upload = Invoice.upload(save_path, file_name) 
end 

私は、次のエラー

AbstractController :: APIのDoubleRenderError :: V0 :: InvoiceApiController#order_invoice この中で複数回呼び出されたレンダリングおよび/またはリダイレクト取得PDFを生成し、アップロード中アクション。レンダリングまたはリダイレクトを呼び出すことができるのは1回の操作につき1回だけです。また、リダイレクトもレンダリングもアクションの実行を終了させないので、リダイレクト後にアクションを終了するには、 "redirect_to(...)and return"のような処理が必要です。

アップロードしたpdfのリンクを回答する必要があります。ここでは2つのレンダリングを使用しているためにエラーが発生しています。しかし、私はエラーを克服する方法を知りません。誰も私がコードを微調整し、修正するのを助けることができます。初心者のレールとapiの。

  1. send_data経由#create_pdf
  2. render :json => responseを経由して、アクションに

UPD:あなたはrepsonseを2回レンダリングするため

+0

だから、あなたは、単一のリクエストの応答に息子だけでなく、PDFファイルを送信したいですか? –

+0

@Jagdeep Singhはいまさに!! –

+0

json *(息子ではない)。 –

答えて

1

これは

を議論した後、我々はこれに来ました - レスポンスにファイルの内容は必要なく、AWSへのリンクのみです。

だから、これはちょうどあなたのsend_file呼び出しを削除修正する:

def create_pdf 
    # render_to_string doesn`t mean "render response", 
    # so it will not end up "double render" 
    pdf = WickedPdf.new.pdf_from_string(
      render_to_string(template: 'invoices/generate_invoice.pdf.erb')) 

    # send_file renders response to user, which you don't need 
    # this was source of "double render" issue 
    # so we can just remove it 
    save_path = Rails.root.join('pdfs', @order['txnid'] + ".pdf") 
    File.open(save_path, 'wb') do |file| 
    file << pdf 
    filename = @order['txnid'] + ".pdf" 
    end 
    file_name = @order['txnid'] + ".pdf" 
    upload = Invoice.upload(save_path, file_name) 
end 
+0

私はそれを認識しています。私はそれらを克服する方法を知らない。 send_dataにあるものは、wicked_pdfで見つけた構文と同じものです。もう1つは、API応答をレンダリングすることです。あなたは私にエラーを克服する方法を示すことができます –

+0

ああ、申し訳ありませんが、あなたの質問の最後の段落を逃した。リンクのみを送信する必要があるのですか、同じレスポンスでファイルの内容を送信しますか? – unkmas

+0

アップロードメソッドでAwsに保存されているpdfのリンクを返しています。私はpdfの作成とアップロード後に同じリンクを返信したいと思っています。 –

関連する問題