2017-03-10 11 views
0

私は、カスタムのPDFをダウンロードするための特別なルートを持っているしたいと思います。PDFは私のRailsアプリケーションで

このPDFは、私のアプリケーションでのERBテンプレートからPDFKitを介して生成されなければなりません。代わりに私が達成したいものを記述する、私はより良いいくつかの非実行が、コメントのコードを貼り付けます。

class MyController < ApplicationController 
    def download_my_list_as_pdf 
    # The template uses the instance variables below 
    @user_id = params[:user_id] 
    @items = ['first_item', 'second_item'] 

    # This line describes what I'd like to do but behaves not like I want ;) 
    # Render the ERB template and save the rendered html in a variable 
    # I'd also use another layout 
    rendered_html = render :download_my_list_as_pdf 

    kit = PDFKit.new(rendered_html, page_size: 'A4') 
    kit.to_pdf 

    pdf_file_path = "#{Rails.root}/public/my_list.pdf" 
    kit.to_file(pdf_file_path) 

    send_file pdf_file_path, type: 'application/pdf' 

    # This is the message I'd like to show at the end 
    # But using 'render' more than once is not allowed 
    render plain: 'Download complete' 
    end 
end 

が、私はまだこの問題に対する答えを見つけることができませんでした、任意の助けをいただければ幸いです!

答えて

1

render_to_string(*args, &block)

文字列へのテンプレートの生レンダリング。

これはrender_bodyに似ていますが、response_body が設定されておらず、常に文字列を返すことが保証されていなければなりません。

renderレスポンスのresponse_bodyを設定する文字列が返されません。

class MyController < ApplicationController 
    def download_my_list_as_pdf 
    # The template uses the instance variables below 
    @user_id = params[:user_id] 
    @items = ['first_item', 'second_item'] 

    # This line describes what I'd like to do but behaves not like I want ;) 
    # Render the ERB template and save the rendered html in a variable 
    # I'd also use another layout 
    rendered_html = render_string(:download_my_list_as_pdf) 

    kit = PDFKit.new(rendered_html, page_size: 'A4') 
    kit.to_pdf 

    pdf_file_path = "#{Rails.root}/public/my_list.pdf" 
    kit.to_file(pdf_file_path) 

    send_file pdf_file_path, type: 'application/pdf' 
    end 
end 

ただし、ファイルを送信している場合は、テキストまたはHTMLも送信できません。これはRailsの制限ではなく、HTTPの仕組みです。 1つのリクエスト - 1つのレスポンス。

通常のJavaScriptは、ファイルのダウンロードを囲む通知を作成するために使用されます。しかし、ブラウザのようにユーザーにとってかなり迷惑なものになっているのは、ファイルをダウンロードしたと主張しているからです。

+0

@maxねえ、あなたの答えや追加説明に感謝!あなたは(http://guides.rubyonrails.org/layouts_and_rendering.html#using-render)[あなたが探しているものを知っている]とき、それは何かを見つけるのは簡単だということを改めて示している。) 今、このと一緒に行きました: 'rendered_html = render_to_string :download_my_list_as_pdf、レイアウト:false' – krebas

関連する問題