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?
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:
Nicht sicher, ob es die beste Lösung ist, aber es scheint zu funktionieren.
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
.
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%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
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).
@Sjors Provoost
Außerdem müssen wir die Methode pt_recordable_object im Modul PaperTrail :: Model :: InstanceMethods überschreiben %Vor%
Tags und Links ruby-on-rails-3 ruby-on-rails carrierwave paper-trail-gem