Rails回形针如何删除附件?
我在Rails 3上使用Paperclip (w / Amazon s3)。我想删除一个现有的附件, 而不用使用更新操作来replace它 。
我只在这里find一个这样的例子,不能得到这个工作,它只是不会删除,并没有什么在日志中说明为什么。 我想在表单上做这样的事情:
<%- unless @page.new_record? || !@page.image? -%> <%= f.check_box :image_delete, :label => 'Delete Image' %> <%- end -%>
(页面是模型的名称,图像是持有附件的属性名称)
但是,如何检测该checkbox,更重要的是,如何删除图像? 我感谢任何帮助!
首先,当你在form_for中创build一个check_box(它看起来像你),那么表单应该默认发送:image_delete如果选中为“1”,如果不选中则为“0”。 方法声明如下所示:
def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")
其中显示如果您想要,您可以分配其他值,但这当然是可选的。
其次,调用手动删除附件而不删除它附加到的模型实例是:
@page.image.destroy #Will remove the attachment and save the model @page.image.clear #Will queue the attachment to be deleted
要完成通过checkbox删除图像的方式,可以在页面模型中添加如下内容:
class Page < ActiveRecord::Base has_attached_file :image before_save :destroy_image? def image_delete @image_delete ||= "0" end def image_delete=(value) @image_delete = value end private def destroy_image? self.image.clear if @image_delete == "1" end end
这样,当您创build表单并添加:image_deletecheckbox时,它将从User实例加载默认值“0”。 如果这个字段被选中,那么控制器会将image_delete更新为“1”,当用户被保存时,它将检查图像是否被删除。
has_attached_file :asset
=>
attr_accessor :delete_asset before_validation { asset.clear if delete_asset == '1' }
没有必要破坏资产,回形针将做到这一点。
在form.check_box(:delete_asset)
的forms就足够了。
这是Benoit的答案,但是包含在模块中,并且覆盖了嵌套属性模型的边界情况,其中销毁tickbox是模型中唯一更改的东西。
它将适用于模型上的所有附件。
# This needs to be included after all has_attached_file statements in a class module DeletableAttachment extend ActiveSupport::Concern included do attachment_definitions.keys.each do |name| attr_accessor :"delete_#{name}" before_validation { send(name).clear if send("delete_#{name}") == '1' } define_method :"delete_#{name}=" do |value| instance_variable_set :"@delete_#{name}", value send("#{name}_file_name_will_change!") end end end end
记得也要将它添加到你的Page模型中:
attr_accessible :image_delete