0

ポリモーフィックな関連付けの種類に応じて、動的なバケット名を作成しようとしています。

私の最初のアプローチは、次のようなことを試みることでした:

class PostImage < ActiveRecord::Base
  belongs_to :imageable, :polymorphic => true

  has_attached_file :image, :styles => { :small => "200x200>", :thumb => "50x50>" },
                            :storage => :s3, 
                            :s3_credentials => "#{Rails.root}/config/s3.yml", 
                            :path => "/:style/:id/:filename", 
                            :bucket => self.imageable_type.to_s

end

新しいオブジェクトを作成しようとすると、次のエラーが発生しました:

NoMethodError: #< Class:0x007fd3fe0b15d8 の未定義のメソッド `imageable_type'

S3のドキュメントでこれを見つけました:

バケット: これは、ファイルを保存する S3 バケットの名前です。バケットは Amazon S3 全体で一意でなければならないことに注意してください。バケットが存在しない場合、Paperclip は作成を試みます。バケット名は補間されません。バケットの名前を実行時に決定したい場合は、バケットを Proc として定義できます。Paperclip は、アタッチメントを唯一の引数としてその Proc を呼び出します。

問題は、ポリモーフィック アソシエーションの名前をバケットの名前として設定するためにこれを機能させる方法がわからないことです。

どんな助けでも大歓迎です。

4

1 に答える 1

0

それが誰かを助けることを願って、

最終的な解決策は、この投稿に基づいていました: rails paperclip S3 with dynamic bucket name

Proc の使用方法のより良い説明については、投稿をお読みください。

最終的なコード:

class PostImage < ActiveRecord::Base
  belongs_to :imageable, :polymorphic => true

  has_attached_file :image, :styles => {
                   :square=> "170x170#",
                   :rectangle=> "220x170#",
                   :large  => "600x400#" }, :storage => :s3, :s3_credentials => "#{Rails.root}/config/s3.yml",
                   :path => "/:style/:id/:filename",
                   :bucket =>  lambda { |attachment| "#{attachment.instance.imageable_type.to_s.downcase}-gallery" }


end
于 2012-11-19T05:40:16.467 に答える