3

Carrierwave アップロード用のテスト固有のストア ディレクトリを定義する方法に関する指示に従いました。これは、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 への呼び出しの前にアップローダ クラスがロードされていない場合、空の配列が返されるため、受け入れられた回答のように各アップローダを指定するか、このようなことを行って、レールとしましょうからすべてのアップローダを要求することができます。アップローダーフォルダ

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