request.format と response ヘッダーを設定する
理解した。Rails sourceによるとrequest.format = 'pdf'
、応答形式を手動で PDF に設定します。これは、たとえば .Rails がレンダリングすることを意味しますshow.pdf.haml
。
Content-Type
ただし、実際には HTML のみを生成しているのに、ヘッダーには既に PDF であると示されているため、PDFKit は応答を実際の PDF に変換しません。そのため、Rails の応答ヘッダーをオーバーライドして、まだ HTML であることを示す必要もあります。
このコントローラ メソッドはそれを処理します。
# By default, when PDF format is requested, PDFKit's middleware asks the app
# to respond with HTML. If we actually need to generate different HTML based
# on the fact that a PDF was requested, this method reverts us back to the
# normal Rails `respond_to` for PDF.
def use_pdf_specific_template
return unless env['Rack-Middleware-PDFKit']
# Tell the controller that the request is for PDF so it
# will use a PDF-specific template
request.format = 'pdf'
# Tell PDFKit that the response is HTML so it will convert to PDF
response.headers['Content-Type'] = 'text/html'
end
つまり、コントローラーのアクションは次のようになります。
def show
@invoice = Finance::Invoice.get!(params[:id])
# Only call this if PDF responses should not use the same templates as HTML
use_pdf_specific_template
respond_to do |format|
format.html
format.pdf
end
end