carrierwave与多个上传者的回调相同

时间:2016-01-18 14:00:45

标签: ruby-on-rails carrierwave

我有一个带有多个上传者的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

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

2 个答案:

答案 0 :(得分:0)

最简单的解决方案是为所有上传器创建一个父类,然后从中继承其他上传器。

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

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

答案 1 :(得分:0)

我认为我终于找到了一个方便的解决方案,感谢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