在我的项目中,我将Paperclip与Paranoia gem一起使用(为了软删除某些模型)。在这个模型中,我同时使用两个宝石:
class Material < ActiveRecord::Base
has_attached_file :material, preserve_files: true
acts_as_paranoid
validates_attachment :material, presence: true
end
Paranoia gem提供了一种硬删除对象的方法:really_destroy!
方法。但是,当我调用此方法时,该对象将被删除但文件将被保留。我也是什么删除文件。例如:
@material_a.destroy # soft-delete the object and preserve the file
@material_b.really_destroy! # hard-delete the object and delete the file
有没有办法动态设置Paperclip preserve_files选项?
答案 0 :(得分:2)
您似乎无法动态设置:preserve_files选项,但还有另一种方法可以执行您想要的操作。
Paperclip首先设置要删除的路径队列,然后在保存对象时删除它们,从而删除附件。如果存在同一对象的多个样式(例如,图像文件的不同大小),则对象可以具有多个要删除的路径。如果你调用#destroy或#clear(不带参数),它会调用#queue_all_for_delete,它会检查是否设置了:preserve_files。但是如果你打电话给#clear并删除一个样式列表,它就会调用#queue_some_for_delete,它不会检查:preserve_files。
因此,我们只需要为#clear提供所有样式的列表:
all_styles = @material_b.attachment.styles.keys.map { |key|
@material_b.attachment.styles[key].name
} << :original
@material_b.attachment.clear(*all_styles)
@material_b.save
@material_b.really_destroy!
答案 1 :(得分:0)
只需删除,:preserve_files =&gt;从代码中为true,删除模型对象时将删除附件
答案 2 :(得分:0)
这是答案
has_attached_file :image, :styles => { :medium => "300x300#", :thumb => "100x100#", :small => "100x100#", :large => "500x500>"}, :convert_options => { :medium => "-quality 80 -interlace Plane", :thumb => "-quality 80 -interlace Plane" }, :default_url => "./public/images/avatar.png", :preserve_files => true, :processors => [:cropper]
你只需要添加没有任何额外的宝石
:preserve_files => true