在Rails 3.1 RC4上使用Carrierwave 0.5.4。
在Rails控制台中,我做:
@foo.attachment
退货:
=> http://cdn.site_name.com/uploads/users/2/banners/banner.png
但是:
@foo.remove_attachment!
退货:
=> [:remove_versions!]
该记录仍保留在DB中,但是文件已在S3存储桶中删除。
发生了什么事?
Ahhh,经过进一步调查。这就是我发现的。remove_attachment!
用于从S3中删除图像,但不用于删除数据库中附件列中的上传器对象。这是Carrierwave的正常行为。
Jnicklas在https://github.com/jnicklas/carrierwave/commit/ecabc618d0fce22c1931c6d2eb134886e3b60e4c其使用CCD_ 2。这是关键,因为当一个人提交表格以删除附件/图像/照片/任何东西时。它们通常包括一个复选框,看起来像:
<input type="checkbox" value="1" name="user[remove_attachment]" id="user_remove_attachment">
可以使用helper标签将其呈现为:
<%= f.check_box :remove_attachment %>
如果单击复选框并提交表单。参数看起来像:
{"utf8"=>"✓", "_method"=>"put", ....., "user"=>{"remove_attachment"=>"1"}, "controller"=>"das....}
Rails会将其解释为@user.remove_attachment = true
以清除db列,并触发.remove_attachment!
从S3中删除该文件。同样值得注意的是。如果在User
模型中定义了attr_accessible。那么它也必须具有:attachment, :remove_attachment
。
希望这能帮助到别人。