Rails,CarrierWave和Fog - 在销毁或覆盖时忽略丢失的文件

Bud*_*Joe 3 ruby-on-rails ruby-on-rails-3 carrierwave fog

Rails中的正确方法是什么是CarrierWave在丢失附件/图像时使用Fog删除/销毁记录?

我想在丢失图像导入RackSpace后清理一些记录.有一些丢失的图像和拇指.当我尝试删除记录时,我收到错误

雾::存储:: Rackspace公司:: NOTFOUND

是否有CarrierWave或Fog设置使其更能容忍这些场景?

小智 7

我刚刚遇到这个问题并发现了原始问题:https://github.com/jnicklas/carrierwave/issues/481以及描述此修复程序的维基页面:https://github.com/jnicklas/carrierwave/维基/如何到%3A-默默-忽略缺失-文件-上摧毁,或重写

但是我对解决方案不满意,我不想将这两种方法添加到我使用上传器的所有模型中.我倾向于编写1个基本上传器和子类,以满足特定需求的任何变化.所以我挖掘了这些方法:删除_#{column_name}!和remove_previously_stored _#{column_name}并在此处找到主题:https: //github.com/jnicklas/carrierwave/blob/master/lib/carrierwave/mount.rb#L204https://github.com/jnicklas/carrierwave/blob /master/lib/carrierwave/mount.rb#L204

这两种方法都只是调用删除!在上传者.因此,解决问题的最简单方法是覆盖删除!上传器中的方法.然后你只需要覆盖一个方法并在一个地方.我的覆盖如下所示:

class CloudfilesUploader < CarrierWave::Uploader::Base
  # Override to silently ignore trying to remove missing previous file
  def remove!
    begin
      super
    rescue Fog::Storage::Rackspace::NotFound
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

当尝试重新上传图像并覆盖不存在的图像或者只是尝试删除不存在的图像时,这应该可以解决您的问题.

〜汤姆