2014-11-05 3 views
7

Mam aplikację szyny, która używa Recurly. Próbuję pobrać plik PDF i wyrenderować go w przeglądarce. Obecnie mam link:Jak renderować plik PDF w przeglądarce, która jest pobierana przez kontroler szyn

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

Związane Sterownik posiada metodę get_invoice, który wygląda tak:

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

Kiedy klikam odnośnik dostaję PDF renderowane w mojej konsoli w postaci binarnej. Jak mogę to zrobić, aby plik PDF był wyświetlany w przeglądarce?

+0

Może spróbuj tego: http://apidock.com/rails/ActionController/Streaming/send_file –

Odpowiedz

8

Zakładając, że plik PDF jest zapisany w pamięci, użyj send_data, aby wysłać strumień danych z powrotem do przeglądarki.

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

Jeśli plik jest zapisany gdzieś (ale to nie wydaje się być sprawa), użyj send_file.

+0

to działa, ale nadal powoduje, że plik PDF jest renderowany w postaci binarnej w konsoli. Jakikolwiek sposób tego uniknąć? – Zack

+0

Zack, zależy to od ustawień rejestratora w twoim środowisku. W fazie rozwoju prawdopodobnie logger jest ustawiony na 'info' lub' debug', więc kilka rzeczy zostanie wysłanych do konsoli. Jedynym sposobem na uniknięcie tego jest zmiana ustawień. Szczerze mówiąc, nie martwiłbym się zbytnio. –

+0

Awesome! Dzięki. :-) – Zack

7

Nie renderujesz pliku PDF do przeglądarki, wysyłasz go jako plik. Tak:

# 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 

Odpowiedź HTML nie jest potrzebne, jeśli nie wspiera wiele formatów.

Jeśli chcesz wyświetlić plik PDF w przeglądarce, zamiast rozpocząć pobieranie, dodaj disposition: :inline do połączenia send_file.