我尝试根据我的多态关联类型创建动态存储桶名称。
我的第一种方法是尝试这样的事情:
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。
问题是我无法理解如何将此多态关联的名称设置为存储桶的名称。
任何帮助将不胜感激。
答案 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