2016-12-17 14 views
0

Rails5でHTMLビューをPDFとしてダウンロードしようとしていますが、PDFをダウンロードするたびにエラーが表示されます。私は、次の宝石を使用しています:ここRails5でPDFkitエラーを使用してPDFをダウンロードする

宝石 'PDFキット' 宝石 'wkhtmltopdf-binary' を

は私のコントローラです:

class InputController < ApplicationController 

def index 
    @inputs = Input.all 
end 


def show 
    @input = Input.find_by(id: params[:id]) 

      send_data @pdf, :filename => @input.company + ".pdf", 
            :type => "application/pdf", 
            :disposition => "attachment" 
end 


end 

私はつまり、ダウンロードURLを入力する場合:localhostを: 3000 /入力/ 1.pdf私はエラーでダウンロードしたPDFファイルを取得する:

enter image description here

マイビューの表示は非常に簡単です:

<ul> 
<li><%= @input.company %></li> 
<li><%= @input.position %></li> 
<li><%= @input.date %></li> 
</ul> 

助けてください。

ベスト、 Ayaz

UPDATE私もちょうど@pdfを取り出して@inputに入れてみました

def show 
    @input = Input.find_by(id: params[:id]) 
      send_data @input, :filename => @input.company + ".pdf", 
            :type => "application/pdf", 
            :disposition => "attachment" 
    end 

結果に異常がないこと

+0

'@input ='行の後に 'p" --->#{@ input} <--- "'と書いて、2つの矢印の間に何があるかサーバーのウィンドウを確認してください。 – 7stud

+0

私はオブジェクトを取得します: "--->#<入力:0x007fcbb8cce0d0><---"。私はpをしました "--->#{@ input.company} <---"と私は正しい応答を得た。 –

答えて

3

あなたのコードインスタンス変数@pdfには何も割り当てません。

def show 
    @input = Input.find_by(id: params[:id]) 

    send_data @pdf, :filename => @input.company + ".pdf", 
        :type => "application/pdf", 
        :disposition => "attachment" 
end 

デフォルト値はnilです。 Rails Guideから

file_path = File.expand_path("../views/input/show.html.erb", __FILE__) 
erb_template = File.read(file_path) 

@input = Input.find_by(id: params[:id]) 
renderer = ERB.new(erb_template) 
html = renderer.result() 

#As above... 

input = Input.find_by(id: params[:id]) 

html = %Q{ 
<ul> 
<li>#{input.company}</li> 
<li>#{input.position}</li> 
<li>#{input.date}</li> 
</ul> 
} 

kit = PDFKit.new(html, :page_size => 'Letter') 
pdf = kit.to_pdf 


send_data pdf, :filename => input.company + ".pdf", 
       :type => "application/pdf", 
       :disposition => "attachment" 

それとも、あなたはビューファイルを読みたい場合は、その後ERBエンジンを通してそれを実行し、このような何か:あなたのような何かをする必要があり

By default, controllers in Rails automatically render views with names that correspond to valid routes.
...
...
The rule is that if you do not explicitly render something at the end of a controller action, Rails will automatically look for the action_name.html.erb template in the controller's view path and render it.

そしてsend_data()のためのドキュメントから:

This method is similar to render plain: data , but also allows you to specify whether the browser should display the response as a file attachment (i.e. in a download dialog) or as inline data

したがってコントローラでsend_data()を呼び出すと、明示的に何かがレンダリングされるため、action_name.html.erbファイルのデフォルトレンダリングは行われません。

+0

@AyazUddin、私の追加を参照してください。 – 7stud

+0

@AyazUddin「send_data()」は、通常のイベントシーケンスを中断します。つまり、通常はアクションが実行され、対応するビューがレンダリングされてブラウザに送信されます。 'send_data()'は、対応するビューをレンダリングしないようにrailsに指示します。 – 7stud

+0

@AyazUddin、私は、ブラウザに何が返ってきたのかを説明するいくつかの引用文を、railsのdocsから追加しました。 – 7stud

関連する問題