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