我想停止carrierwave删除文件

nod*_*rog 10 ruby-on-rails carrierwave

我想设置一个特定的上传器,以便当相关的模型对象被销毁时,亚马逊s3上的文件不会被删除.

这样做的原因是我的上传模型记录虽然被破坏仍然在第二个审计表中被引用.

我正在使用雾,载波和s3.

Vir*_*ren 11

那么据我所知remove_previously_stored_files_after_update,当一个模型对象只工作updated所以将其设定为false不会删除旧的file过程中update

但在您的情况下,您必须确保在相关模型对象被销毁时文件仍然存在

好,我不认为有(如果检查代码这里)没有机制目前可在Carrierwave

但你可以覆盖它remove!来实现相同的我想这涉及设置attr_accessor(这是决定是保留文件还是删除它的标志)

在你想要的模型里面定义一个attr_accessor(比如keep_file)

并在所需的上传器中覆盖删除!方法

class MyUploader < CarrierWave::Uploader::Base 
  def remove!
     unless model.keep_file
       super
     end
  end
end
Run Code Online (Sandbox Code Playgroud)

并确保attr_accessor在销毁之前设置对象(如果要保留已删除的文件)

u = User.find(10)
u.keep_file = true
u.destroy 
Run Code Online (Sandbox Code Playgroud)

这将确保在从数据库中删除记录时清除文件

让我知道是否有更好的做法

希望这有帮助


mkk*_*mkk 11

实际上有一种方法可以做到这一点,你只需要跳过删除它的回调:

skip_callback :commit, :after, :remove_<column_name>!
Run Code Online (Sandbox Code Playgroud)

例如

# user.rb
mount_uploader :avatar
skip_callback :commit, :after, :remove_avatar!
Run Code Online (Sandbox Code Playgroud)

请参阅https://github.com/carrierwaveuploader/carrierwave#skipping-activerecord-callbacks


Dav*_*ton 8

为所有人或一些上传者保留文件

CarrierWave.configure do |config|
  config.remove_previously_stored_files_after_update = false
end
Run Code Online (Sandbox Code Playgroud)

如果要在每个上载的基础上配置它:

class AvatarUploader < CarrierWave::Uploader::Base
  configure do |config|
    config.remove_previously_stored_files_after_update = false
  end

  ...
end
Run Code Online (Sandbox Code Playgroud)