2016-07-14 13 views
0

CollectionLetterという2つのモデルがあります。 Collectionには多くのLetterがあり、Letterは明らかにbelongs_to Collectionです。私は疑問を持っているAWS S3のURL/PATHをPaperclip/Railsで正しく設定する

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 

についてurlhas_attached_filepath属性:

以下は私のLetter.rbファイルです。

パスに文字モデルのIDを設定する代わりに、コレクションのIDを設定したいと思います。また、Letterの属性であるtitleも入れたいと思います。 @collectionのIDが1であるとしましょう。@collectionは@ letter1と@ letter2を持っています。ファイルをAWS S3に保存すると、/pdf/1(which is collection_id)/:titleに保存します。 urlpathにどうすればいいですか?

答えて

1

Paperclipでは、補間を使用できます。

has_attached_fileメソッドは、このようになります。

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

補間ファイルを作成しますが、多少のようなコードが含まれているconfig/initializersディレクトリ(レールが起動時にそのフォルダ内の任意のスクリプトをピックアップ)、中paperclip.rbまたはinterpolations.rbと呼ばれます。

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

同様に補間を:title追加します。あなたのhas_attached_file URLにそれを加え、そのための第2補間を作成します。ユーザが同じタイトルを持つ2つのドキュメントをアップロード可能であるかもしれないとURLの文字のID、:あなたはあなたのケースではhttps://github.com/thoughtbot/paperclip/wiki/Interpolations

でこれについての詳細を読むことができ

、私も含めてお勧めしますそれは矛盾するかもしれない。

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

ペーパークリップは、ファイルの一意のパスを作成するには、デフォルトで補間:basename:extension:styleを使用しています。

  • :basenameアップロードされたファイル
  • :extensionのベースファイル名は、そのアップロードされたファイル
  • :styleの拡張子は「スタイル」またはあなたができることを、アップロードされたファイル

の大きさであるです複数のスタイルを指定する(さまざまなバージョンのthumnailsなど)。デフォルトのスタイルは「オリジナル」です。オリジナルのアップロードされたファイルが含まれます。

スタイルの詳細については、こちらをご覧ください。 https://github.com/thoughtbot/paperclip/wiki/Thumbnail-Generation

今後も元のファイルをそのまま使用してください。サイト/アプリケーションのレイアウトが変更され、新しいサムネイルサイズが必要な場合。サムネイルライブラリ全体を元のバージョンから再構築/再生成することができます。

サムネイルの生成/再生の詳細については、こちらをご覧ください。 https://github.com/thoughtbot/paperclip/wiki/Thumbnail-Generation#generatingregenerating-your-thumbnails

+0

'config/initializers'ディレクトリに、' paperclip.rb'か何かを作っていますか?補間コードはどこに置くべきですか?なぜなら、 '' style::basename::extension ''は何をしているのか少し説明できますか?なぜか分かりませんが、AWSで' Original'フォルダを作り続けています。 basename.:extension "'? – JoHksi

+0

こんにちは、はい、あなたは、paperclip.rbと呼ばれるスクリプトを作成することができます。論理的には聞こえますが、好きな名前を付けても構いません(interpolations.rbもいい名前です)。私は ':style'、':basename'と ':extension'プロパティに関する答えを更新します。 – Stijnster

+0

完璧な答えをありがとう! – JoHksi

0

イメージをs3にアップロードするためのrorアプリケーションにgem aws-sdkを使用 オブジェクトまたはアプリケーションごとに異なるフォルダを持つ固定バケットにイメージをアップロードします。 バケット内のコンテンツには、 の制限がありませんが、s3ではバケットの数が制限されています。

このコードは、aws-sdk gemを使用して、ユーザーの画像をs3にアップロードします。バケツとアップロードされた画像は公開されて になり、アップロードされた画像に直接アクセスできます。入力には、画像の完全なパス があります。そこにはアップロードするフォルダとuser_idがあります。 をアップロードする必要があります。

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 

使用キー= folder_name.to_s + "/" + File.basename(IMAGE_LOCATION)あなたが持っているしたいパスをカスタマイズすることができます。

関連する問題