2016-10-25 6 views
0

Ich benutze pdfkit, um pdf zu generieren, mit Rails 5. Wenn ich versuche, Seiten der externen Website zu downloaden, wie Google es funktioniert. Aber wenn ich eine Seite meiner Website herunterladen will, tut es nichts. Der Ladecursor wird für immer geladen.Pdfkit funktioniert nicht lokal

Hier ist mein Code:

Controller/Produkte

def download 
    @product = Product.find(params[:product_id]) 
    file_content = html_to_pdf(request.url, @product.id) 
    open_file = File.read(file_content) 
    send_data(open_file, 
       filename: "ptf_#{@product.id}", 
       disposition: 'attachment') 
    end 

Produkte/show

<%= button_to 'download', download_product_path(product_id: @product.id), method: :get} %> 

Methode in einem Besorgnis

def html_to_pdf(url, id) 
    kit = PDFKit.new(url) 
    file = kit.to_file('ptf_'+ id.to_s + '.pdf') 
end 

Wenn ich es mit file_content = html_to_pdf('http://google.com', @product.id) versuche, funktioniert es gut. Das Problem ist lokal. Danke für Ihre Hilfe.

+0

Innerhalb 'Download', was ist der Wert von' request.url'? – Stefan

+0

Der Wert ist "http: // localhost: 3000/fr/products/download/2" – Orsay

+0

Und diese Anfrage wird wieder von 'ProductsController # download' behandelt, oder? Sie rufen die Aktion 'download' rekursiv auf. Wahrscheinlich möchten Sie eine PDF-Datei von "http: // localhost: 3000/fr/products/2" 'erzeugen. – Stefan

Antwort

0
file_content = html_to_pdf(request.url, @product.id) 

request.url bezieht sich auf Ihre aktuelle URL, so dass Sie den Aufruf der download Aktion rekursiv immer und immer wieder.

Stattdessen müssen Sie das Produkt der Show URL:

file_content = html_to_pdf(products_url(@product.id), @product.id) 

http://guides.rubyonrails.org/routing.html#path-and-url-helpers Siehe

+0

Ok, also es eine Seite herunterladen, aber eine Seite mit einem Fehler. Ich weiß nicht, warum die URL nicht richtig gelesen wird. Wenn ich Ihren Code verwende, lautet die heruntergeladene URL http: // localhost: 3000/fr/2/products anstelle von http: // localhost: 3000/fr/products/2. Wenn ich das 's' also => ​​product_url lösche, wird die Seite für immer wie bisher geladen. – Orsay

+0

@Orsay scheint, als ob Ihre Routen nicht standardmäßig konfiguriert sind. Probieren Sie 'products_url (product_id: @ product.id)' aus (oder vielleicht auch ohne 's'). Sie können die URL in der Rails-Konsole über 'app.products_url (product_id: 123)' überprüfen - sie muss '/fr/products/2' zurückgeben, um zu funktionieren (' 'ist wahrscheinlich' www.example.com 'statt' localhost', das ist okay). Wenn Sie "Rake-Routen" ausführen, werden Ihnen die Routen in Ihrer App angezeigt. Das könnte helfen, das richtige Argument und die richtigen Argumente zu finden. – Stefan

+0

gibt es meine Route: Produkt GET (/:locale)/products/:id(.:format) Produkte # show {: locale =>/en | fr /} – Orsay