2016-07-14 14 views
0

Ich habe zwei Modelle: Collection und Letter. Collection hat viele Letter s und Letter offensichtlich gehört zu Collection.URL/PATH richtig für AWS S3 mit Büroklammer/Schienen einstellen

Unten ist mein Letter.rb Datei:

class Letter < ActiveRecord::Base 
    belongs_to :collection 

    has_attached_file :pdf, 
        :url => "/pdf/:id/:style/:basename.:extension", 
        :path => "/pdf/:id/:style/:basename.:extension", 
        :s3_host_name => host_name, 
        :storage => :s3, 
        :bucket => ENV['S3_BUCKET_NAME'], 
        :s3_credentials => { 
             :access_key_id =>#ENV['AWS_ACCESS_KEY_ID'], 
             :secret_access_key =>ENV['AWS_SECRET_ACCESS_KEY'] 
            } 

    validates_attachment :pdf, 
        :content_type => { 
         :content_type => 
          ["application/pdf", "text/plain", /\Aimage\/.*\Z/, "application/msword"] 
        } 

end 

Ich habe eine Frage zu url und path Attribut in has_attached_file.

Anstatt die ID des Buchstabenmodells im Pfad zu setzen, möchte ich die ID der Sammlung festlegen. Zusätzlich möchte ich auch title setzen, was das Attribut von Letter ist. Lassen Sie uns sagen @collection 's ID ist 1. @collection hat @ letter1 und @ letter2. Wenn ich die Dateien in AWS S3 speichere, möchte ich sie unter /pdf/1(which is collection_id)/:title speichern. Wie kann ich das in url und path schreiben?

Antwort

1

In Paperclip können Sie Interpolationen dafür verwenden.

Ihre has_attached_file Methode würde ungefähr so ​​aussehen;

has_attached_file :image, :default_url => "/pdf/:collection_id/:title/:basename.:extension" 

Eine Interpolation Datei namens paperclip.rb oder interpolations.rb im config/initializers Verzeichnis (Schienen nimmt jedes Skript in diesem Ordner beim Start up), die Code enthält, der etwas sieht wie folgt aus;

Paperclip.interpolates :collection_id do |attachment, style| 
    attachment.instance.collection_id 
end 

Fügen Sie die :title Interpolation auf die gleiche Weise hinzu; Fügen Sie es zu Ihren has_attached_file URLs hinzu und erstellen Sie eine zweite Interpolation dafür.

Sie können https://github.com/thoughtbot/paperclip/wiki/Interpolations

In Ihrem Fall mehr darüber lesen, würde ich die auch beinhalten vorschlagen: id des Briefes in der URL, wie es die Börse zwei Dokumente mit demselben Titel möglich sein könnte, was zu Konflikten führen könnte.

has_attached_file :image, :default_url => "/pdf/:collection_id/:id/:title" 

Büroklammer verwendet die Einschübe :basename, :extension und :style standardmäßig einen eindeutigen Pfad für die Datei zu erstellen.

  • :basename ist die Basisdateinamen der hochgeladenen Datei wird
  • :extension die Verlängerung dieser hochgeladenen Datei wird
  • :style der „Stil“ oder Größe des hochgeladenen Datei

können Sie Spezifizieren Sie mehrere Stile (wie Thumails in verschiedenen Versionen). Der Standardstil ist "Original" und enthält die ursprüngliche hochgeladene Datei.

Lesen Sie hier mehr über Stile; https://github.com/thoughtbot/paperclip/wiki/Thumbnail-Generation

Versuchen Sie immer, die Originaldatei beizubehalten, da sie in Zukunft nützlich sein kann; Wenn sich Ihr Site-/Anwendungslayout ändert und neue Miniaturansichten erforderlich sind. Sie können Ihre gesamte Thumbnail-Bibliothek von der ursprünglichen Version wiederherstellen/neu erstellen.

Lesen Sie hier mehr über das Generieren/Regenerieren von Thumbnails; https://github.com/thoughtbot/paperclip/wiki/Thumbnail-Generation#generatingregenerating-your-thumbnails

+0

In 'config/initializers' -Verzeichnis, mache ich eine' papierklammer.rb' oder etwas? Wo sollte ich den Interpolationscode eingeben? Und kannst du ein wenig erklären, was ': style /: basename.: Extension" 'tut? Ich weiß nicht warum, aber es wird weiterhin' Original'-Ordner in AWS gemacht. Ist das wegen ': style /: basename.:extension "'? – JoHksi

+0

Hallo, ja, Sie können ein Skript namens paperclip.rb erstellen. Das klingt logisch, aber es kann einen beliebigen Namen haben (interpolations.rb wäre auch ein guter Name). Ich werde die Antwort bezüglich der Eigenschaft ': style',': basename' und ': extension' aktualisieren. – Stijnster

+0

Vielen Dank für die perfekte Antwort !! – JoHksi

0

Verwenden von Gem aws-sdk für eine Anwendung zum Hochladen von Bildern nach s3 Hochladen von Bildern in einen festen Bucket mit verschiedenen Ordnern für jedes Objekt oder jede Anwendung. Der s3 behält eine Begrenzung der Anzahl der Buckets Creation, während es keine Einschränkung für Inhalt in einem Bucket gibt.

Dieser Code wird Bild für einen Benutzer auf s3 mit AWS-SDK Gem hochladen. Der Bucket und das hochgeladene Bild werden veröffentlicht , so dass die hochgeladenen Bilder direkt zugänglich sind. Die Eingabe, die es nimmt, ist der Image Complete-Pfad , wo es vorhanden ist, Ordner, in dem es hochgeladen werden sollte und user_id für den es sollte hochgeladen werden.

def save_screenshot_to_s3(image_location, folder_name,user_id) 
    service = AWS::S3.new(:access_key_id => ACCESS_KEY_ID, 
          :secret_access_key => SECRET_ACCESS_KEY) 
    bucket_name = "app-images" 
    if(service.buckets.include?(bucket_name)) 
     bucket = service.buckets[bucket_name] 
    else 
     bucket = service.buckets.create(bucket_name) 
    end 
    bucket.acl = :public_read 
    key = folder_name.to_s + "/" + File.basename(image_location) 
    s3_file = service.buckets[bucket_name].objects[key].write(:file => image_location) 
    s3_file.acl = :public_read 
    user = User.where(id: user_id).first 
    user.image = s3_file.public_url.to_s 
    user.save 
    end 

Verwenden key = folder_name.to_s + "/" + File.basename (Imagespeicherorts) den Pfad Sie haben wollen, anpassen.