4

在 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!] 

该记录仍保留在数据库中,该文件已在 S3 存储桶中删除。

到底是怎么回事?

4

1 回答 1

9

啊,经过进一步调查。这是我发现的。remove_attachment!旨在从 S3 中删除图像,但并不意味着删除 db 中附件列中的上传器对象。这是 Carrierwave 的正常行为。

Jnicklas 在https://github.com/jnicklas/carrierwave/commit/ecabc618d0fce22c1931c6d2eb134886e3b60e4c提供了一个测试图,它使用 @doc.remove_image = true. 这是关键,因为当一个人提交表单以删除附件/图像/照片/任何东西时。它们通常包含一个复选框,如下所示:

<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 中删除文件。也值得注意。如果在模型中定义了 attr_accessible User。那么它也必须有:attachment, :remove_attachment

希望这可以帮助某人。

于 2011-06-14T18:17:27.547 回答