Frage

Früher: Ausführen einer Modellmethode auf einem Paperclip -Anhang nach dem Erstellen oder Update (papierclip -Rückrufe scheinen nicht zu funktionieren)

Bearbeiten (später am Tag)Ich habe mein Problem herausgefunden. Der Prozessor arbeitet offenbar mit der aktualisierten Datei zusammen, speichert jedoch erst nach der Verarbeitung Dateien. Ich habe meinen Zip :: Zipfile geändert, um "Datei" statt "Anhang.Path" zu öffnen, da der Anhangspfad noch nichts enthält. Dies hat das erste Problem behoben. Jetzt habe ich andere Probleme, die ich aufspüren muss. Aber die Antwort unten ist meistens korrekt.

Bearbeiten (31.01.2011):

Daher habe ich den Rat angenommen, einen Prozessor für meinen Anhang zu erstellen, der alle notwendigen Aktionen ausführt. Bisher sieht es so aus, als ob es funktionieren sollte; Der Prozessor startet und macht anscheinend alle Initialisierungsmaterial. Wenn ich jedoch den Punkt bekomme, an dem ich auf die ZIP -Datei zugreifen möchte, die hochgeladen wird, erhalte ich einen Fehler, der besagt, dass die Datei nicht gefunden werden kann. Der Code für meinen Prozessor ist unten:

class Extractor < Processor
    attr_accessor :resolution, :whiny
    def initialize(file, options = {}, attachment = nil)
      super
      @file = file
      @whiny = options[:whiny].nil? ? true : options[:whiny]
      @basename = File.basename(@file.path, File.extname(@file.path))
      @attachment = attachment
      @instance = attachment.instance
    end
    def make
      # do your conversions here, you've got @file, @attachment and @basename to work with
      export_path = attachment.path.gsub('.zip', '_content')

      Zip::ZipFile.open(attachment.path) { |zip_file|
        zip_file.each { |image|
          image_path = File.join(export_path, image.name)
          FileUtils.mkdir_p(File.dirname(image_path))
          unless File.exist?(image_path)
            zip_file.extract(image, image_path)
            # ..stuff that it does..
          end
        }
      }
      # clean up source files, but leave the zip
      FileUtils.remove_dir(export_path)


      # you return a file handle which is the processed result
      dst = File.open result_file_path
    end
end

Und hier ist der Inhalt des Fehlers, den ich bekomme:

Zip::ZipError in GalleriesController#create

File /home/joshua/railscamp/moments_on_three/public/assets/archives/delrosario.zip not found

Rails.root: /home/joshua/railscamp/moments_on_three
Application Trace | Framework Trace | Full Trace

config/initializers/extractor.rb:16:in `make'
app/controllers/galleries_controller.rb:32:in `new'
app/controllers/galleries_controller.rb:32:in `create'

Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"0s4L4MrlqjDTMjzjgkUdvUxeHklZNOIShDhT6fgOICY=",
 "gallery"=>{"name"=>"DelRosario",
 "public"=>"0",
 "owner_id"=>"1",
 "shoot_date(1i)"=>"2011",
 "shoot_date(2i)"=>"1",
 "shoot_date(3i)"=>"31",
 "category_id"=>"1",
 "archive"=>#<ActionDispatch::Http::UploadedFile:0x00000004148d78 @original_filename="delrosario.zip",
 @content_type="application/zip",
 @headers="Content-Disposition: form-data; name=\"gallery[archive]\"; filename=\"delrosario.zip\"\r\nContent-Type: application/zip\r\n",
 @tempfile=#<File:/tmp/RackMultipart20110131-9745-14u347v>>},
 "commit"=>"Create Gallery"}

Soweit ich sagen kann, sucht es nach der Datei an der richtigen Stelle, aber die Datei scheint nicht hochgeladen zu werden, um darauf zuzugreifen. Soweit mir bekannt ist, ist Paperclip klug genug, um zu wissen und auf das Hochladen zu warten, bevor er versucht, ihn zu verarbeiten. Kann jemand erkennen, was ich hier falsch mache?

Danke vielmals.

Altes Zeug:

Ich entwickle eine Fotogalerie -App mit Rails 3 und Paperclip. Der Administrator kann eine Galerie erstellen und eine ZIP -Datei mit einer Reihe von Bildern hochladen.

Was ich passieren möchte:

  1. Geben Sie Galerie -Informationen und ZIP -Datei ein, um in das Formular hochzuladen.
  2. Drücken Sie die Schaltfläche "Galerie erstellen".
  3. Formulare, Galerie -Speichern und ZIP -Datei werden hochgeladen.
  4. Führen Sie die Methode aus, nachdem die ZIP -Datei hochgeladen wurde: extract_photos (übrigens, dieser Code funktioniert). 4.A. Am Ende dieser Methode wird die ZIP -Datei zerstört.
  5. Der Administrator wird mit allen Fotos auf der Galerie umgeleitet (wo die Galerie hat_Many -Fotos).

Ich habe versucht, diese Arbeit auf verschiedene Arten zu machen.

Vorher habe ich eine Controller -Methode erstellt, mit der der Administrator auf einen Link klicken kann, mit dem die Methode extract_photos ausgeführt wurde. Dies funktionierte auf meinem Computer, aber aus irgendeinem Grund hatte der Server Schwierigkeiten, dies auf dem Computer des Clients zu leiten. Es ist also ein No -Go. Außerdem dachte ich, es wäre eine hässliche Art, es zu tun.

Kürzlich habe ich versucht, Callback -Methoden zu verwenden. After_Save hat nicht funktioniert, da es anscheinend den Formularposten unterbricht und die Datei nicht hochgeladen wird und die: extract_photos die Datei nicht finden kann.

Ich habe Callback -Methoden auf der Paperclip -Github -Seite ausgecheckt, und es geht über die Rückrufe:

Vor und nach dem Postverarbeitungsschritt ruft Paperclip mit wenigen Rückrufen zum Modell zurück, sodass das Modell den Verarbeitungsschritt ändern oder absagen kann. Die Rückrufe sind "vor-Post_process" und "After_Post_process" (die vor und nach der Verarbeitung jedes Anhangs genannt werden) und der bindungsspezifische "vorpost_process" und "Afterpost_process". Die Rückrufe sollen so nahe wie möglich an den normalen ActivereCord -Rückernständen stehen. Wenn Sie also in einem vorfilter falschen zurückgeben (speziell - NIL -NIL ist nicht gleich), wird der Nachbearbeitungsschritt angehalten. Wenn Sie Falsch in einem After -Filter zurückgeben, stoppen Sie nichts, aber Sie können bei Bedarf auf das Modell und den Anhang zugreifen.

Ich habe versucht, vorher zu verwenden. Wenn ich vorpost_process und Afterpost_process probiere, bekomme ich außerdem einen Nomethoderror.

Wie rufe ich also eine Methode auf einem Anhang auf, wenn sie erstellt oder aktualisiert wird, aber nachdem die Datei hochgeladen wurde und an der richtigen Stelle?

AKTUALISIEREN

Ich habe den folgenden Code ausprobiert und meinen Extraktionsmethodencode in die Methode des Prozessors verwandelt. Ich bin weiter gekommen als zuvor mit dem Versuch, einen Prozessor zu schreiben, aber es ist immer noch ein No-Go. Der Prozess löst eine Ausnahme aus, sobald ich versuche, die hochgeladene Datei zur Verarbeitung zu öffnen, und sagt, dass die Datei nicht existiert. Das Namensschema ist richtig und alles, aber still Es wird nichts hochgeladen, bevor der Prozess ausgelöst wird. Hat jemand eine Idee, warum das passiert?

War es hilfreich?

Lösung

Sie können Ihren eigenen Prozessor schreiben, um dies zu erreichen.

In Ihrem Modell beim Deklarieren der Papierklip -Sachen einen benutzerdefinierten Prozessor hinzufügen

  has_attached_file :my_attachment, {
    :styles => {:original => {:processors => [:my_processor]}}
  }.merge(PAPERCLIP_SETTINGS)

Schreiben Sie dann Ihren eigenen Prozessor und setzen Sie es auf Konfiguration/Initializer:

module Paperclip
  class MyProcessor < Processor
    attr_accessor :resolution, :whiny
    def initialize(file, options = {}, attachment = nil)
      super
      @file = file
      @whiny = options[:whiny].nil? ? true : options[:whiny]
      @basename = File.basename(@file.path, File.extname(@file.path))
      @attachment = attachment
    end
    def make
      # do your conversions here, you've got @file, @attachment and @basename to work with

      # you return a file handle which is the processed result
      dst = File.open result_file_path
    end
  end
end

Ich benutze einen benutzerdefinierten Prozessor zu Dingen, die ähnlich wie bei viel Verarbeitung und Konvertieren der Datei in der Mitte ähnlich sind, und es scheint gut zu funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top