2016-04-16 6 views
0

Ich baue ein Kundendatenbank/Fakturierungssystem. Wenn Rechnungen mit PDFKit in druckbare PDFs konvertiert werden können, werden sie aus dem Index Rechnungen über ein Formular ausgewählt, das Kontrollkästchen enthält, die die Rechnungs-IDs über den Parameter selected_invoices übergeben. Ich möchte auf diese Methode zurückgreifen und gleichzeitig die PDF-Adressetiketten für diese spezifischen Rechnungen erstellen. Ich kann nicht herausfinden, wo ich hier falsch liege. Wenn die Methode "Labels" aufgerufen wird, kann sie die Rechnungs-IDs aus den Parametern nicht sehen.Parameter zwischen mehreren Methoden in Rails übergeben

Hier ist der relevante Teil des Codes:

def generate_multiple_pdfs 

#generate pdfs from selected invoices and save each to file 
@invoices = Invoice.find(params[:selected_invoices]) 
files = [] 
@invoices.each do |invoice| 
    path = show_pdf_invoice_url(invoice) 
    filename = "invoice_#{invoice.id}.pdf" 
    files.push filename  

    kit = PDFKit.new(path) 
    pdf = kit.to_file("#{Rails.root}/public/invoices/#{filename}") 
end 

#generate address labels for selected invoices 
path = labels_invoices_url 
filename = "invoice_labels#{Date.today.to_formatted_s(:iso8601)}.pdf" 
files.push filename 

kit = PDFKit.new(path) 
pdf = kit.to_file("#{Rails.root}/public/invoices/#{filename}") 
... 
end 

Hier ist die Etiketten-Methode, die von PDFKit aufgerufen wird:

def labels 
@invoices = Invoice.find(params[:selected_invoices]) 
    render :layout => 'labels_layout' 
end 

Die Etiketten Methode fehlschlägt, ist hier, was im Hintergrund passiert:

Processing by InvoicesController#labels as HTML 
Invoice Load (0.3ms) SELECT "invoices".* FROM "invoices" WHERE "invoices"."id" = $1 LIMIT 1 [["id", nil]] 
Completed 404 Not Found in 1ms (ActiveRecord: 0.3ms) 
ActiveRecord::RecordNotFound (Couldn't find Invoice with 'id'=): 
app/controllers/invoices_controller.rb:160:in `labels' 

Der Rest des Prozesses funktioniert gut, ich kann die PDFs für die in Stimmen werden erzeugt. Was fehlt mir hier?

Danke!

+0

Können Sie zeigen, wie Sie Labels anrufen? Wo postet das Formular? – margo

+0

Labels werden von pdfkit über die Route labels_invoices_url aufgerufen: 'path = labels_invoices_url' und dann' kit = PDFKit.new (path) '. Ich bin mir nicht sicher, wonach Sie fragen, wo das Formular veröffentlicht wird. – TheStrabusiness

+0

Sie müssen die Parameter explizit an die Methode labels übergeben. Der params-Hash ist nur für die Methode verfügbar, auf die du poste. Daher rate ich zu den format-POSTs für generate_multiple_pdfs. – margo

Antwort

0

Ich habe versucht, die Parameter oder die Variable vorbei explizit in ein paar Möglichkeiten einschließlich:

path = labels_invoices_url(@invoices) und path = labels_invoices_url(params[:selected_invoices]

Beide, die gab mir ähnliche Fehler. Ich habe versucht, eine andere Taktik und erstellt zwei Schaltflächen auf der Indexseite einreichen:

<%= submit_tag "Print Selected Invoices" %> <%= submit_tag "Print Labels" %>

ich den Vorteil der einzelnen Tasten haben ihre eigenen in den params begehen zu senden, und modifiziert, um die generate_multiple_pdfs Methode mit einem if/else-Anweisung zu params[:commit] überprüfen:

def generate_multiple_pdfs 
    if params[:commit] == "Print Labels" 
    @invoices = Invoice.find(params[:selected_invoices]) 
    render :labels, :layout => 'labels_layout' 
    else 
    #do the invoice pdfs 
    end 
end 

Dies ist nicht die Etiketten im pDF-Format generiert, und es dauert zwei Klicks statt, aber es funktioniert jetzt.

Wenn jemand weiß, wie Variablen oder Parameter durch PDFKit übergeben werden, wie ich es versucht habe, würde ich ihre Hilfe sehr schätzen. Ansonsten sieht es so aus, als würde ich die Dokumentation durchsuchen, um zu sehen, welche Grundlagen ich vermisse.

Danke!

1

try Änderung path = labels_invoices_url zu path = labels_invoices_url(@invoices)

+0

Danke, ich schätze Ihre Antwort. Ich habe das schon ausprobiert, aber es gab mir immer noch den gleichen Fehler 'ActiveRecord :: RecordNotFound (Konnte mit 'id' = keine Rechnung finden): app/controllers/rechnungsrechner.rb: 160: in 'labels'' habe ich mich gebessert es auf eine andere Art und Weise. Ich werde in einer Sekunde posten. – TheStrabusiness

Verwandte Themen