多个上传者的carrierwave相同回调

carrierwave same callback for multiple uploaders

我有一个包含多个上传者的 rails 应用程序。 在每个上传器中,我希望在每个文件删除后执行一个函数。 我可以在每个上传器中放置一个触发器和一个回调:

 after :remove, :remove_dir
 def remove_dir
    FileUtils.remove_dir("#{Rails.root}/public/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}", :force => true)
 end

但这不是很聪明... 可能有更好的方法来做到这一点????

最简单的解决方案是为所有上传者创建父级 class,然后从中继承其他上传者。

如果您在父级 class 中放置一个回调,它将被所有子级执行。父 class 当然应该继承自 CarrierWave::Uploader::Base

另一种解决方案是创建一个模块并将其包含在所有上传器 classes 中。

我想我终于找到了一个方便的解决方案,感谢 Michal Szyndel 它帮助了我并给了我很好的线索:

每个上传者都继承自CarrierWave::Uploader::Base,所以我通过carrierwave 的初始化文件(carrierwave.rb) 向它添加了一个回调,然后通过位于相关上传者中的触发器调用它。

在 carrierwave.rb 中:

module CarrierWave
  module Uploader
    class Base
      def remove_dir
        path = "#{Rails.root}/public/"+store_dir
        FileUtils.remove_dir(path, :force => true) if Dir[path+'/*'].empty?
      end
    end
  end
end

相关上传者:

after :remove, :remove_dir