动态生成S3的存储桶名称

时间:2012-11-12 04:33:58

标签: ruby-on-rails-3 amazon-s3 paperclip

我尝试根据我的多态关联类型创建动态存储桶名称。

我的第一种方法是尝试这样的事情:

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:未定义的方法`imageable_type'用于#&lt;分类:0x007fd3fe0b15d8

我在S3文档中找到了这个:

  

bucket:这是将存储文件的S3存储桶的名称。请记住,该存储桶在整个Amazon S3中必须是唯一的。如果存储桶不存在,Paperclip将尝试创建它。存储桶名称不会被插值。如果要在运行时确定其名称,可以将存储桶定义为Proc。 Paperclip将把附件作为唯一参数称为Proc。

问题是我无法理解如何将此多态关联的名称设置为存储桶的名称。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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