Papertrail und Carrierwave

8

Ich habe ein Modell, das beides verwendet: Carrierwave für Geschäftsfotos und PaperTrail für Versionierung.

Ich habe Carrierwave auch so konfiguriert, dass verschiedene Dateien bei Updates gespeichert werden (weil ich die Fotos versionieren möchte) mit config.remove_previously_stored_files_after_update = false

Das Problem ist, dass PaperTrail versucht, das gesamte Ruby-Objekt vom Foto (CarrierWave Uploader) anstatt nur einer Zeichenfolge (das wäre seine URL) zu speichern

(Versionstabelle, Spaltenobjekt)

%Vor%

Wie kann ich das beheben, um eine einfache Zeichenfolge in der Fotoversion zu speichern?

    
eveevans 23.02.2012, 23:44
quelle

6 Antworten

11

Sie können item_before_change in Ihrem versionierten Modell überschreiben, so dass Sie den Uploader-Zugriff nicht direkt aufrufen und stattdessen write_attribute verwenden. Alternativ können Sie, da Sie dies möglicherweise für mehrere Modelle tun möchten, die Methode direkt affinen, wie folgt:

%Vor%

Nicht sicher, ob es die beste Lösung ist, aber es scheint zu funktionieren.

    
rabusmar 25.02.2012, 00:47
quelle
5

Hinzufügen von @ beardedds Kommentar als Antwort, weil ich denke, dass dies ein besserer Weg ist, das Problem zu lösen.

Benennen Sie Ihre Datenbankspalten so wie picture_filename und mounten Sie dann in Ihrem Modell den Uploader mit:

class User < ActiveRecord::Base has_paper_trail mount_uploader :picture, PictureUploader, mount_on: :picture_filename end

Sie verwenden weiterhin das Attribut user.picture.url , um auf Ihr Modell zuzugreifen, aber PaperTrail speichert Revisionen unter picture_filename .

    
Gerry Shaw 25.02.2015 07:52
quelle
3

Hier ist eine etwas aktualisierte Version von monkeypatch von @rabusmar, ich benutze es für rails 4.2.0 und paper_trail 4.0.0.beta2, in /config/initializers/paper_trail.rb .

Die zweite Methodenüberschreibung ist erforderlich, wenn Sie die optionale object_changes -Spalte für Versionen verwenden. Es funktioniert etwas komisch für carrierwave + fog, wenn Sie filename im Uploader überschreiben, alter Wert wird von cloud und neu von lokalem Dateiname sein, aber in meinem Fall ist es in Ordnung.

Ich habe auch nicht überprüft, ob es richtig funktioniert, wenn Sie die alte Version wiederherstellen.

%Vor%     
biomancer 07.04.2015 12:19
quelle
1

Dies ist, was tatsächlich für mich funktioniert, setzen Sie das auf config / initializers / paper_trail / .rb

%Vor%

Dies überschreibt die retify-Methode für die Arbeit mit S3 + heroku

Damit Uploader alte Dateien von aktualisierten oder gelöschten Datensätzen behalten, tun Sie dies im Uploader

%Vor%

Dann machen Sie eine Routine, um alte Dateien von Zeit zu Zeit zu löschen, viel Glück

    
ErvalhouS 20.12.2016 20:55
quelle
0

Ich möchte zu den vorherigen Antworten Folgendes hinzufügen:

Es kann passieren, dass Sie verschiedene Dateien mit demselben Namen hochladen, und dies könnte Ihre vorherige Datei überschreiben, so dass Sie die alte Datei nicht wiederherstellen können.

Sie können einen Zeitstempel in Dateinamen verwenden oder zufallsgeneriert und eindeutige Dateinamen für alle versionierten Dateien .

Aktualisieren

Dies scheint nicht in allen Randfällen für mich zu funktionieren, wenn ich mehr als eine einzige Datei demselben Objekt innerhalb einer einzelnen Anfrageanforderung zuweise.

Ich benutze das gerade jetzt:

%Vor%

Dies scheint zu funktionieren, da die @cache_id für jeden Upload erneut generiert wird (was nicht der Fall ist, wie es für die Ideen in den obigen Links scheint).

    
Joshua Muheim 11.04.2015 21:41
quelle
0

@Sjors Provoost

Außerdem müssen wir die Methode pt_recordable_object im Modul PaperTrail :: Model :: InstanceMethods überschreiben %Vor%     

zenkovnick 11.02.2016 08:16
quelle