Paperclip (3.0) und Rails (3.2): f.file_field verliert nach einem Validierungsfehler den Dateipfad bei der 'neuen' Aktion

8

Ich habe ein story -Modell mit einem image -Anhang eingerichtet, der von Paperclip gehandhabt wird, das wie folgt aussieht:

%Vor%

Wenn ich meine Geschichte fülle, sieht das so aus:

%Vor%

Wenn die Validierung für einen story.title zu lange fehlschlägt, wird das Formular erneut zusammen mit der korrekten Fehlermeldung und angezeigt. Der Wert für file_field ist jetzt leer und ich muss erneut darauf klicken, um die Datei, die ich hochladen möchte, erneut auszuwählen .

Und so sieht mein stories_controller.rb aus:

%Vor%

Wie kann ich verhindern, dass Benutzer die Datei, die nach einem Validierungsfehler hochgeladen werden soll, erneut auswählen müssen?

    
Darme 22.06.2012, 09:07
quelle

4 Antworten

5

Wie HTTP-Datei-Uploads in Browsern funktionieren, wurde die Datei bereits beim ersten Senden in Ihre App hochgeladen. Sie sollten sie also irgendwo speichern, damit Sie später noch auf ein zweites Formular zugreifen können. (Zumindest in PHP wird eine hochgeladene Datei nach dem Ausführen des Skripts gelöscht, wenn sie nicht explizit verschoben wurde - ich weiß nicht, ob das auch für RoR gilt.)

Sie können ein Eingabefeld = Dateifeld in HTML nicht vorfüllen - aus Sicherheitsgründen. Und selbst wenn der Benutzer die Datei erneut wählt, müsste er sie ein zweites Mal senden - Verschwendung von Benutzer und Bandbreite.

Speichern Sie sie also entweder beim ersten Senden oder versuchen Sie, Ihre Validierungen auch auf der Clientseite mit JavaScript durchzuführen, bevor das Senden zulassen (so weit wie möglich), damit Sie die Formularübergaben minimieren die tatsächlich Validierung auf der Serverseite fehlschlagen.

    
CBroe 24.06.2012 18:29
quelle
2

Möglicherweise wird Ссылка für Sie geeignet sein. Es ermöglicht die Formularprüfung entsprechend den in Ihrem Modell definierten Regeln, ohne die Seite erneut zu laden.

    
trushkevich 02.03.2013 10:45
quelle
1

CBroe hat Recht, die beste Lösung ist, die Datei vorübergehend zu speichern. Was ich tun würde, ist: - Verschieben Sie die Datei in ein temporäres Verzeichnis und benennen Sie sie mit der ID des Benutzers, der sie hochladen wollte. - Wenn das Formular veröffentlicht wurde und keine Datei hochgeladen wurde, versuchen Sie, die temporäre Datei für diesen Benutzer zu verwenden (falls vorhanden). - Wenn die Story erfolgreich gespeichert wurde, löschen Sie alle temporären Dateien für diesen Benutzer.

Ich denke, das sollte den Trick machen.

    
iwiznia 28.06.2012 18:19
quelle
1

Ich musste das an einem kürzlichen Projekt beheben. Es ist ein bisschen hacky, aber es funktioniert. Ich habe versucht, cache_images () mit After_validation und before_save im Modell aufzurufen, aber es scheitert bei create aus irgendeinem Grund, dass ich nicht bestimmen kann, so dass ich es nur vom Controller aufrufen. Hoffentlich rettet dies jemand anderes etwas Zeit!

Modell:

%Vor%

Controller:

%Vor%

anzeigen:

%Vor%     
galatians 16.05.2014 22:22
quelle