我想停止carrierwave删除文件

时间:2013-06-25 16:28:09

标签: ruby-on-rails carrierwave

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

这样做的原因是我的上传模型记录虽然已被销毁,但仍会在第二个审核表中引用。

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

4 个答案:

答案 0 :(得分:11)

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

skip_callback :commit, :after, :remove_<column_name>!

例如

# user.rb
mount_uploader :avatar
skip_callback :commit, :after, :remove_avatar!

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

答案 1 :(得分:10)

AFAIK remove_previously_stored_files_after_update仅在模型对象为updated时才有效,因此将其设置为false将不会在file期间删除旧update

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

我不认为那里(如果您检查代码here)是Carrierwave中当前可用的任何机制

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

在您想要的模型中定义一个attr_accessor(比如keep_file)

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

class MyUploader < CarrierWave::Uploader::Base 
  def remove!
     unless model.keep_file
       super
     end
  end
end

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

示例

u = User.find(10)
u.keep_file = true
u.destroy 

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

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

希望这个帮助

答案 2 :(得分:8)

Keeping files for all, or some uploaders

CarrierWave.configure do |config|
  config.remove_previously_stored_files_after_update = false
end

如果您想在每次上传的基础上进行配置:

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

  ...
end

答案 3 :(得分:0)

我遇到一种情况,我不仅需要在上传新文件时还需要在我的上传器中保留文件,而且在删除记录本身时也需要这些文件。我发现Dave Newton和mkk上面建议的混合效果很好:

在我的上传器中,我添加了:

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

然后在我的模型上添加:

class Resource < ApplicationRecord
  # Skip the remove callback so the files remain upon deletion of the Resource record
  mount_uploader :attachment, AttachmentUploader
  skip_callback :commit, :after, :remove_attachment!
  ...
end