3

我已经按照说明如何为 carrierwave uploads 定义特定于测试的存储目录,这建议打开CarrierWave::Uploader::Base类并重新定义store_dircache_dir如下所示:

if defined?(CarrierWave)
  CarrierWave::Uploader::Base.descendants.each do |klass|
    next if klass.anonymous?
    klass.class_eval do
      def cache_dir
        "#{Rails.root}/spec/support/uploads/tmp"
      end 

      def store_dir
        "#{Rails.root}/spec/support/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
      end 
    end 
  end
end

这就像一个魅力,除了当我用 spork 运行 rspec 时,它无法修改类并且上传存储在默认位置。有谁知道为什么会发生这种情况?

4

2 回答 2

3

AvatarUploader在我们的项目中工作的其他人通过在行前添加一行来解决这个问题CarrierWave::Uploader::Base.descendants.each,如下所示:

if defined?(CarrierWave)
  AvatarUploader # load AvatarUploader class 
  CarrierWave::Uploader::Base.descendants.each do |klass|
  #...

不完全确定为什么会这样,但确实如此。

于 2013-02-13T02:55:10.363 回答
1

对于任何来到这里的人来说,除了接受的答案之外几乎没有什么:

如果在调用 CarrierWave::Uploader::Base.descendants 之前未加载上传器类,它将返回空数组,因此要么在接受的答案中指定每个上传器,要么你可以做这样的事情来要求所有上传器,比如说 rails上传者文件夹

Dir["#{Rails.root}/app/uploaders/*.rb"].each {|file| require file}
CarrierWave::Uploader::Base.descendants.each do |klass|
#...
于 2015-01-27T17:00:32.320 回答