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 回答