我正在使用Paperclip将我的文档上传到Amazon S3。当我上传新文档时,我想自动创建一个与我的项目ID相对应的存储桶。
因此,在我的控制器中,我有以下代码:
def new
@pmdocument = Pmdocument.new
@pmdocument.projectmilestone_id=params[:projectmilestone_id]
其中projectmilestone_id是我的项目的外键(用作我的存储桶名称)
我的模型如下:
class Pmdocument < ActiveRecord::Base
belongs_to :projectmilestone
attr_accessible :id, :name, :description, :projectmilestone_id, :pmdoc, :projectmilestone_attributes
attr_protected :pmdoc_content_type, :pmdoc_size
accepts_nested_attributes_for :projectmilestone, :allow_destroy => false
has_attached_file :pmdoc,
:storage => :s3,
:bucket => self.projectmilestone_id.to_s,
:s3_credentials => File.join(Rails.root, 'config', 's3.yml')
当我加载页面时,出现以下错误: undefined method `projectmilestone_id' for #
我检查了我的控制器,projectmilestone_id字段在那里正确加载。
我尝试将bucket行更改为
:bucket => self.name
,然后错误消失了。模型工作正常,因为projectmilestone_id在数据库中正确存储。
我的猜测是可能与可访问属性有关,但它似乎也没问题。
到底是什么问题?非常感谢!
我真的不明白:
我决定不再更改我的bucket(这是一个坏主意,因为所有S3的名称都需要唯一),而是改变我的路径。
这是代码:
:path => proc { |attachment| "#{attachment.istance.projectname}/:attachment/:id/:basename.:extension" },
我的项目名称下的第一个文件夹没有被创建。如果我将projectname替换为name,甚至是description(pmdocuments的另一个字段),就可以实现创建文件夹,但是projectname无法创建文件夹。当然,我检查了projectname是否正确填充。原因在其他地方。
有什么线索吗?
pmdocument.pmdoc = params[...]
或pmdocument.update_attributes(...)
这样的一行)。确保在此分配之前,您的对象具有有效的projectcapstone
。 - Michaël Witrant