gpt4 book ai didi

ruby-on-rails - 带有动态存储桶名称的 rails 回形针 S3

转载 作者:行者123 更新时间:2023-12-04 03:45:29 24 4
gpt4 key购买 nike

我正在使用回形针将我的文档上传到 Amazon S3。我想在上传新文档时使用我的项目 ID 自动创建一个存储桶。

因此,在我的 Controller 中,我有这个:

 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')

当我加载页面时,出现此错误:
#的未定义方法`projectmilestone_id'

我检查了我的 Controller ,并且在那里正确加载了 projectmilestone_id 字段。

我试图将桶线更改为 :bucket => self.name然后错误消失了。

该模型工作正常,因为 projectmilestone_id 正确存储在数据库中。

我的猜测是它可以链接到可访问的属性,但似乎也可以。

怎么了?非常感谢!!!

我真的不明白:

我决定不再更改我的存储桶(无论如何都是坏主意,因为所有 S3 的名称都必须是唯一的),而是更改我的路径。

这是代码:
:path => proc { |attachment| "#{attachment.istance.projectname}/:attachment/:id/:basename.:extension" },

没有创建带有我的项目名称的第一个文件夹。如果我按名称或什至描述(pmdocuments 的另一个字段)替换 projectname,它可以工作,但不能与 projectname 一起使用。当然,我检查了项目名称是否正确填充。原因在别处。

有什么线索吗?

最佳答案

has_attached_file方法在类的上下文中执行(加载文件时),而不是在可以使用属性和其他实例方法的记录实例的上下文中执行。 self.name确实有效,但它返回类的名称( "Pmdocument" ),而不是记录的名称。

但是 Paperclip 可以满足您的需求。 documentation on the S3 storage说:

You can define the bucket as a Proc if you want to determine it’s name at runtime. Paperclip will call that Proc with attachment as the only argument.



在你的情况下,它会是这样的:
has_attached_file :pmdoc,
:storage => :s3,
:bucket => proc { |attachment| attachment.instance.projectmilestone_id.to_s },
:s3_credentials => File.join(Rails.root, 'config', 's3.yml')

现在你通过一个 Prochas_attached_file .加载类时不会评估块的内容,但稍后会在需要时评估。然后 Paperclip 使用 attachment 调用块作为参数并使用返回值作为存储桶名称。

编辑:

不幸的是,这个块在分配文件时运行,而不是在保存记录时运行。所以你的所有属性可能还没有设置(当你做 Pmdocument.new(params[:pmdocument]) 时属性的分配顺序是不确定的)。我希望 Paperclip 以另一种方式工作,但同时我看到 2 个选项:

您可以从 Controller 中的 params 中删除该文件,并在其他一切准备就绪时进行设置:
pmdoc = params[:pmdocument].delete(:pmdoc)
@pmdocument = Pmdocument.new(params[:pmdocument])
@pmdocument.pmdoc = pmdoc

或者您可以通过 before_post_process 禁用 Paperclip 后处理来延迟它(参见 README 的事件部分)并在 after_save callback 中运行它.

关于ruby-on-rails - 带有动态存储桶名称的 rails 回形针 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5982976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com