2012-03-05 17 views
13

私はCarrierwaveを使い始めました。テストや遅延ジョブによって、複数の場所に一時ファイルが保存されていました。Carrierwaveのtempディレクトリがuploads/tmpフォルダに設定されています

テスト中に実行された場合(rspec)、一時ファイルはRAILS_ROOT/uploads/tmpディレクトリになります。

それが遅れて仕事中に行われた場合、一時ファイルがRAILS_ROOT/public/uploads/tmp

最初に、私はrails_root/tmp/uploadsがより賢明な場所、あるいはシステムの一時フォルダであろうと考えていただろう。

第2に、正常な実行とは異なるテストはバグのようです。

この問題を解決する方法はありますか(設定または猿のパッチのいずれか)?そして、RAILS_ROOT/tmpフォルダに物を置くことはできますか?

答えて

19

「config/initializers/carrierwave.rb」で設定できるconfig.cache_dirオプションがあります。しかし、それは '/ public'に相対的です。

class MyUploader < CarrierWave::Uploader::Base 

    def cache_dir 
    # should return path to cache dir 
    Rails.root.join 'tmp/uploads' 
    end 
end 
+0

魅力的な作品です。これを有効にするには、アプリケーションを再起動する必要があります。 –

+0

また、 'attr_writer cache_dir'をクラスに追加し、関数を' @cache_dir || 'に変更しました。 Rails.root.join 'tmp/uploads''は、インスタンスごとのオーバーライドを可能にします(開発ファイルからテストファイルを分離するのに便利です)。 – Leo

+0

cache_dirとstore_dirの違いは何ですか? – Jwan622

7

私はキャリアウェーブ0.10.0を使用しています。この動作が対応されたようです。今cache_dir設定は、公開ディレクトリの外にあるパスを受け入れ:

CarrierWave.configure do |config| 
    config.cache_dir = Rails.root.join 'tmp/uploads' 
end 
1

iKindredの答えは私のために働いたが、私はCarrierWave 0.10とRailsの4.2.3で動作するように私はそれを得た方法を拡張しようと思いました@ 0.0:

どこCarrierWaveはRailsのの一部ではないとしてのconfigureブロックに

を置くためには、configureブロックを置くのに最適な場所は、Rails Guideの私の読書によると、初期化ファイルです。名前は任意に選択できますが、それはRails.root/config/initializersに存在する必要があります。私は設定していたモジュールの後にファイル名をつけることにしました:Rails.root/config/initializers/carrier_wave.rb。私は私のRailsアプリがdevelopmentモードで実行されている間、私はテストを実行することを見つける何を初期化ファイルに

を置く

。テストの後、私はhereのようにストレージパスのリンクを解除してすべてのファイルをクリーンアップします。 developmentモードで実行されているRailsアプリケーションによって保存されたファイルを壊さずに動作させるには、ストレージパスを環境ごとに分離する必要があります。したがって、私の修正版の@ iKindredの答えは:

#config/initializers/carrier_wave.rb 
CarrierWave.configure do |config| 
    config.cache_dir = File.join(Rails.root, 'tmp', 'uploads', Rails.env) 
end 
関連する問題