0

我有一个使用回形针上传照片的Post模型的Rails应用程序。我希望能够在帖子的edit视图中删除帖子中的照片。下面的代码后删除的图像,但现在我不能创建新附件(新的或现有的职位):删除使用回形针创建的附件

class Post < ActiveRecord::Base 

    has_attached_file :photo 
    validates_attachment_content_type :photo, :content_type => /\Aimage\/.*\Z/ 

    attr_accessor :delete_photo 
    before_save :delete_photo, if: ->{ delete_photo == '1' && !photo.dirty? } 

    private 
    def delete_photo 
    self.photo = nil 
    end 
end 

views/posts/edit.html.erb

<fieldset> 
    <ol class="post-fields-list"> 
     <li> 
     <%= f.label :title %><br /> 
     <%= f.text_field :title %> 
     </li> 
     <li> 
     <%= f.label :body %><br /> 
     <%= f.text_area :body %> 
     </li> 
     <li><%= f.file_field :photo %></li> 
     <li> 
     <%= f.label :delete_image %><br /> 
     <%= f.check_box :delete_photo %> 
     </li> 
    </ol> 
    </fieldset> 

在上面的列表中的最后一个元素是创建用于删除图像的复选框的位置。

如前所述,当我注释掉该行模型:

before_save :delete_photo, if: ->{ delete_photo == '1' && !photo.dirty? } 

我可以创建附件没有问题。

感谢您的帮助!

UPDATE:

我注意到,通过f.check_box生成的HTML看起来相当怪异:

<input name="post[delete_photo]" type="hidden" value="0" /><input id="post_delete_photo" name="post[delete_photo]" type="checkbox" value="1" /> 

回答

1

而不是attr_accessor :delete_photo进行删除照片属性访问器尝试创建自己的getter和setter方法delete_photo。 使用clear方法删除附件,而不是分配nil

class Post < ActiveRecord::Base 

    has_attached_file :photo 
    validates_attachment_content_type :photo, :content_type => /\Aimage\/.*\Z/ 

    before_save :delete_photo 

    def delete_photo 
    @delete_photo ||= "0" 
    end 

    def delete_photo=(value) 
    @delete_photo = value 
    end 

    private 
    def delete_photo 
     self.photo.clear = nil if @delete_photo == '1' && !self.photo.dirty? 
    end 
end 
+0

刚试过这个,但它不起作用...顺便说一句,图像被保存到'/ public'文件夹中的磁盘。 – abbottjam 2014-09-30 11:32:43

2
has_attached_file :photo 
attr_accessor :delete_photo 
before_validation { photo.clear if delete_photo == '1' } 

无需破坏资产,回形针会做到这一点。

在窗体form.check_box(:delete_asset)就足够了。

+0

简单!我喜欢这个。 – courtsimas 2016-07-07 20:06:25