0

Ich habe drei Fragen im Zusammenhang mit Büroklammer und AWS S3.Paperclip benutzerdefinierte Interpolation (aka benutzerdefinierten Pfad für AWS S3)

1) In meinem Modell, das Büroklammer hat, ich habe folgenden Code:

has_attached_file :attachment, 
    :url => "/songs/:user_id/:basename.:extension", 
    :path => "/songs/:user_id/:basename.:extension" 

Was ist der Unterschied zwischen URL und PATH?

2) Was ist :basename.:extension?

3) Nehmen wir an, es gibt zwei Modelle: User und File. User hat viele File. Paperclip Pfad und URL sind in File Modell konfiguriert.

In config/initializers/paperclip.rb, ich unten Code setzen:

Paperclip.interpolates :user_id do |attachment, style| 
    attachment.instance.criteria.user_id 
end 

Ich bestätige, dass obiger Code funktioniert prima. Meine Datei wird unter songs/5/song.mp3 gespeichert. Ich möchte die MP3-Datei unter songs/user_id_5/song.mp3 speichern. Ich habe es unten versucht, aber es funktioniert nicht.

Paperclip.interpolates :user_id do |attachment, style| 
    'user_id_' + attachment.instance.criteria.user_id 
end 

Wie mache ich es so wie ich es möchte?

Antwort

0
  1. in S3 Sprache path ist der Schlüssel Ihres Artikels und url ist Ihr s3 Endpunkt

Von docs

  • url: Es gibt vier Optionen für die S3-URL sind. Sie können festlegen, dass der Name des Buckets domänenartig (bucket.s3.amazonaws.com) oder Pfadstil (s3.amazonaws.com/bucket) platziert wird. Sie können auch einen CNAME angeben (für den der CNAME als s3_alias_url angegeben werden muss. Sie können lesen Sie mehr über CNAMEs und S3 unter docs.amazonwebservices.com/AmazonS3/latest/index.html?VirtualHosting.html Normalerweise Das ist egal, und Sie können die Standard (das ist Pfad-Stil, oder: s3_path_url). Aber in einigen Fällen Pfade funktionieren nicht und Sie müssen die Domain-Stil verwenden (: s3_domain_url Alle anderen hier werden wie Pfad-Stil behandelt.

  • Pfad: Dies ist der Schlüssel unter dem Eimer, in dem die Datei gespeichert wird. Die URL wird aus dem Bucket und dem Pfad erstellt. Das ist was Sie werden interpolieren wollen. Schlüssel sollten eindeutig sein, wie Dateinamen, und trotz der Tatsache, dass S3 (genau genommen) keine Verzeichnisse unterstützt, können Sie trotzdem einen/verwenden, um Teile Ihres Dateinamens zu trennen.

Sie die bucket oder url in der Config konfigurieren und übergeben Sie einfach die path (dwo die Datei gespeichert werden), wenn Sie die Methode

config.paperclip_defaults = { 
    storage: :s3, 
    s3_credentials: { 
    bucket: 'mybucket'), 
    access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'), 
    secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'), 
    s3_region: 'aws_region_id', 
    } 
} 
nennen
  1. Ich weiß nicht,

  2. Sie String-Interpolation

    Paperclip.interpolates :user_id do |attachment, style| 
        "user_id_#{attachment.instance.criteria.user_id}" 
    end 
    
brauchen
+0

Für # 3 funktioniert String nicht. Nicht sicher warum. – JoHksi

+0

Also, wenn Sie haben ': Pfad =>": user_id "...' in Ihrer 'has_attached_file' Methode, was ist der Wert von Pfad? –