1

Paperclip を介して S3 に background_image をアップロードできるサイト モデルがあります。奇妙な点は、各サイトのモデルに独自の S3 クレデンシャル ストアがあることです。私の質問はこれです。Paperclip 経由でアップロードするときに、サイト自体の属性を参照するにはどうすればよいですか?

class Site < ActiveRecord::Base
  attr_accessible :background_image, 
                  :s3_access_key_id,
                  :s3_secret_access_key,
                  :s3_username

  has_attached_file :background_image,
                    storage: :s3,
                    s3_credentials: {
                      access_key_id: @s3_access_key_id.to_s,
                      secret_access_key: @s3_secret_access_key.to_s
                    },
                    bucket: "my-app",
                    s3_permissions: "public-read",
                    path: "/home/#{@s3_username}/background_images/:id/:filename"
end

残念ながら、このセットアップではThe AWS Access Key Id you provided does not exist in our records. データベースから値をハードコーディングすると正常に機能するため、空白の値を取得しているだけだと思います。

4

1 に答える 1

2

ここでの問題は、サイトインスタンスではなく、最初に読み取られたときにクラスhas_attached_fileで呼び出されることです。幸いなことに、paperclip はいくつかの場所で動的構成をサポートしており、実行時にインスタンスを取得できます。代わりにこれを試してください:Site site.rbSite

has_attached_file :background_image,
  s3_credentials: lambda { |attachment| attachment.instance.s3_keys },
  path: lambda { |attachment| "/home/#{attachment.instance.s3_username}/background_images/:id/filename" }


def s3_keys
  {
    access_key_id: self.s3_access_key_id.to_s,
    secret_access_key: self.s3_secret_access_key.to_s
  }
end

Paperclip::Attachmentこれらのラムダは、オブジェクトがパラメーターとして渡されて、実行時に評価されます。Siteでインスタンスを取得できますPaperclip::Attachment#instance。そのため、インスタンスでメソッドを呼び出して、その特定のキーを取得できます。

s3_usernameをパスに入れるために、より具体的/高度なトリックを使用することもできます。ペーパークリップにさらにパス名の補間を教えることができます。でファイルを追加できるようにconfig/initializers/paperclip.rb

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

そして、あなたのSiteモデルは次のようになります

has_attached_file :background_image,
  s3_credentials: lambda { |attachment| attachment.instance.s3_keys },
  path: "/home/:s3_username/background_images/:id/:filename"


def s3_keys
  {
    access_key_id: self.s3_access_key_id.to_s,
    secret_access_key: self.s3_secret_access_key.to_s
  }
end
于 2013-10-04T21:39:57.460 に答える