我有一个使用Recurly的rails应用。我正在尝试下载PDF并在浏览器中呈现它。我目前有一个链接:
link_to 'Download', get_invoice_path(:number => invoice.invoice_number)
关联的控制器具有get_invoice
方法,如下所示:
def get_invoice
begin
@pdf = Recurly::Invoice.find(params[:number], :format => 'pdf')
rescue Recurly::Resource::NotFound => e
flash[:error] = 'Invoice not found.'
end
end
当我点击链接时,我会以二进制形式在控制台中呈现PDF。如何在浏览器中渲染PDF?
答案 0 :(得分:12)
假设PDF已保存在内存中,请使用send_data
在浏览器中重新发送数据流。
def get_invoice
@pdf = Recurly::Invoice.find(params[:number], :format => 'pdf')
send_data @pdf, filename: "#{params[:number]}.pdf", type: :pdf
end
如果文件存储在某处(但似乎不是这种情况),请使用send_file
。
答案 1 :(得分:11)
您不能将PDF呈现给浏览器,而是将其作为文件发送。像这样:
# GET /something/:id[.type]
def show
# .. set @pdf variable
respond_to do |format|
format.html { # html page }
format.pdf do
send_file(@pdf, filename: 'my-awesome-pdf.pdf', type: 'application/pdf')
end
end
end
如果您不支持多种格式,则无需HTML回复。
如果您想在浏览器中显示PDF而不是开始下载,请将disposition: :inline
添加到send_file
来电。