11

I have a rails app that uses Recurly. I am attempting to download a PDF and render it in the browser. I currently have a link:

link_to 'Download', get_invoice_path(:number => invoice.invoice_number)

The associated controller has the get_invoice method that looks like so:

def get_invoice
    begin
      @pdf = Recurly::Invoice.find(params[:number], :format => 'pdf')
    rescue Recurly::Resource::NotFound => e
      flash[:error] = 'Invoice not found.'
    end
  end

When I click the link I get the PDF rendered in my console in binary form. How do I make this render the PDF in the browser?

Zack
  • 2,377
  • 4
  • 25
  • 51

2 Answers2

18

You don't render the PDF to the browser, you send it as a file. Like so:

# 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

The HTML response isn't needed if you aren't supporting multiple formats.

If you want to show the PDF in the browser instead of starting a download, add disposition: :inline to the send_file call.

Nick Veys
  • 23,458
  • 4
  • 47
  • 64
  • 2
    disposition: :inline was exactly what I was looking for ! It renders in the browser instead of downloading – Jamesst20 Jul 30 '18 at 15:16
12

Assuming the PDF is saved in memory, use the send_data to send the data stream back in the browser.

def get_invoice
  @pdf = Recurly::Invoice.find(params[:number], :format => 'pdf')
  send_data @pdf, filename: "#{params[:number]}.pdf", type: :pdf
end

If the file is stored somewhere (but this doesn't seem to be your case), use send_file.

Simone Carletti
  • 173,507
  • 49
  • 363
  • 364
  • this works, but still causes the pdf to be rendered in binary form in the console. Any way to avoid this? – Zack Nov 05 '14 at 22:56
  • Zack, this depends on the logger settings of your environment. In development, it's likely the logger is set to `info` or `debug`, therefore a bunch of stuff will be sent to the console. The only way to avoid this is changing the settings. To be honest, I would not worry too much. – Simone Carletti Nov 05 '14 at 22:57