führt Büroklammer S3 mit dynamischem Bucket-Namen aus

8

Ich verwende Büroklammer, um meine Dokumente auf Amazon S3 hochzuladen. Ich möchte automatisch einen Bucket mit der ID meiner Projekte erstellen, wenn ich ein neues Dokument hochlade.

Daher habe ich in meinem Controller:

%Vor%

Dabei ist projectmilestone_id der Fremdschlüssel für mein Projekt (der als mein Bucket-Name verwendet werden soll)

Mein Modell ist so:

%Vor%

Wenn ich die Seite lade, erhalte ich folgende Fehlermeldung: undefinierte Methode 'projectmilestone_id' für #

Ich habe meinen Controller überprüft und das Feld projectmilestone_id wurde dort korrekt geladen.

Ich habe versucht, die Bucket-Zeile in :bucket => self.name zu ändern, und dann ist der Fehler weg.

Das Modell funktioniert, weil projectmilestone_id korrekt in der db gespeichert ist.

Meine Vermutung ist, dass es mit den zugänglichen Attributen verknüpft werden könnte, aber es scheint auch in Ordnung zu sein.

Was ist los? Vielen Dank !!!

Ich verstehe es wirklich nicht:

Ich habe beschlossen, meinen Bucket nicht mehr zu ändern (schlechte Idee, da der Name für alle S3 eindeutig sein muss), sondern stattdessen meinen Pfad zu ändern.

Dies ist der Code:

%Vor%

Der erste Ordner mit meinem Projektnamen wurde nicht erstellt. Wenn ich Projektname durch Name oder sogar Beschreibung (ein anderes Feld von PM-Dokumenten) ersetze, funktioniert es, aber nicht mit Projektname. Natürlich habe ich überprüft, ob der Projektname richtig ausgefüllt ist. Der Grund ist woanders.

Irgendwelche Hinweise?

    
ndemoreau 12.05.2011, 18:56
quelle

1 Antwort

10

Die Methode has_attached_file wird im Kontext der Klasse ausgeführt (wenn die Datei geladen wird), nicht im Kontext einer Datensatzinstanz, in der Sie Attribute und andere Instanzmethoden verwenden könnten. self.name funktioniert zwar, aber es gibt den Namen der Klasse ( "Pmdocument" ) zurück, nicht den Namen eines Datensatzes.

Aber Paperclip ist freundlich genug, um zu erlauben, was Sie wollen. Die Dokumentation zum S3-Speicher lautet:

  

Sie können den Bucket als Proc definieren, wenn   Sie möchten seinen Namen ermitteln   Laufzeit. Büroklammer wird diesen Proc   mit Anhang als einziges Argument.

In Ihrem Fall wäre es etwa so:

%Vor%

Nun gibst du Proc an has_attached_file weiter. Der Inhalt des Blocks wird nicht ausgewertet, während Ihre Klasse geladen ist, aber später, wenn sie benötigt wird. Anschließend ruft Paperclip den Block mit dem Anhang als Argument auf und verwendet den zurückgegebenen Wert als Bucket-Name.

Bearbeiten:

Leider wird dieser Block ausgeführt, wenn die Datei zugewiesen wird, nicht wenn der Datensatz gespeichert wird. Daher sind möglicherweise noch nicht alle Ihre Attribute festgelegt (die Reihenfolge der Zuweisung der Attribute bei Pmdocument.new(params[:pmdocument]) ist nicht festgelegt). Ich möchte, dass Paperclip anders funktioniert, aber in der Zwischenzeit sehe ich 2 Optionen:

Sie können die Datei von den Parametern im Controller entfernen und sie einstellen, wenn alles andere bereit ist:

%Vor%

Oder Sie können die Nachbearbeitung von Paperclip verzögern, indem Sie sie mit before_post_process deaktivieren (siehe den Abschnitt Ereignisse in der README ) und führen Sie es in einem after_save -Rückruf aus.

    
Michaël Witrant 12.05.2011, 19:43
quelle