2016-03-31 73 views
0

Meine Rails-App ändert den Status eines Elements, aber wenn dies der Fall ist, können potenzielle Fehler auftreten. Ich entwickle eine Möglichkeit, dem Benutzer zu ermöglichen, diese Fehler zu überschreiben, und anschließend einen PDF-Bericht zu erstellen, damit sie ihn als eine Quittung dessen, was sie getan haben, ausdrucken können.Datenbank in Rails App-Updates, bevor ein Prawn-PDF-Bericht erstellt werden kann

Hier ist der Code, der den Bericht und schließt die Aktion für jedes Element entwickelt:

def report 
    ids = params[:ids].split() 
    @items = Item.order("id").where(id: ids) 

    respond_to do |format| 
    format.html 
    format.pdf { prawnto(page_size: "A4", inline: true)} 
    end 

    @items.each do |item| 
    item.action 
    end 
end 

Mein Problem ist, dass, um auf Fehler zu prüfen (zum Beispiel unvereinbar Zustände des Elements), I müssen den Artikel vor die Aktion in Kraft gesetzt testen.

Jeder Test, den ich bisher gemacht habe, zeigt an, dass die items.each-Blockierung ausgewertet wird, bevor der Bericht abgeschlossen ist. Meine App benötigt das Gegenteil.

Jede Hilfe und/oder eine Erklärung, warum dieses Verhalten auftritt, würde sehr geschätzt werden.

Antwort

1

Der Controller-Code wird vor dem Rendern vollständig ausgeführt. Das Verschieben der Reihenfolge führt hier nichts aus, da der Block, den Sie für das Format pdf angegeben haben, bis zum Ende ignoriert wird. Es besteht keine Verpflichtung, dass es sofort ausgeführt wird, weil Sie es definiert haben.

Wenn Sie es wirklich erste, erfassen das Ergebnis des Berichts geschehen müssen, dann ist das in der Methode Rendering verwenden:

# Execute the report immediately. 
report_pdf = prawnto(...) 

respond_to do |format| 
    format.pdf { report_pdf } 
end