2014-11-05 2 views
7

Ich habe eine Rails-App, die Recurly verwendet. Ich versuche, ein PDF herunterzuladen und es im Browser zu rendern. Im Moment habe ich einen Link:So rendern Sie eine PDF-Datei im Browser, die über den Rails-Controller abgerufen wird

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

Die zugehörige Steuerung hat die get_invoice Methode, wie so aussieht:

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

Wenn ich auf den Link ich das PDF in meiner Konsole in binärer Form gemacht zu bekommen. Wie kann ich das PDF im Browser rendern lassen?

+0

Vielleicht versuchen Sie dies: http://apidock.com/rails/ActionController/Streaming/send_file –

Antwort

8

Angenommen, die PDF-Datei ist im Arbeitsspeicher gespeichert, verwenden Sie die send_data, um den Datenstrom im Browser zurückzusenden.

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

Wenn die Datei irgendwo gespeichert (aber dies scheint nicht Ihr Fall ist), verwenden send_file.

+0

das funktioniert, aber immer noch bewirkt, dass das PDF in binärer Form in der Konsole gerendert wird. Kann ich das vermeiden? – Zack

+0

Zack, das hängt von den Loggereinstellungen Ihrer Umgebung ab. In der Entwicklung ist es wahrscheinlich, dass der Logger auf 'info' oder' debug' gesetzt ist, daher wird eine Menge Zeug an die Konsole gesendet. Der einzige Weg, dies zu vermeiden, ist das Ändern der Einstellungen. Um ehrlich zu sein, würde ich mir keine Sorgen machen. –

+0

Super! Vielen Dank. :-) – Zack

7

Sie rendern das PDF nicht zum Browser, Sie senden es als Datei. Wie 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 

Die HTML-Antwort ist nicht erforderlich, wenn Sie nicht mehr Formate unterstützt werden.

Wenn Sie das PDF im Browser anzeigen möchten, anstatt einen Download zu starten, fügen Sie disposition: :inline dem send_file Aufruf hinzu.