2012-03-05 11 views
13

Zacząłem używać Carrierwave i dowiedziałem się, że przechowuje pliki tymczasowe w wielu miejscach w zależności od tego, czy jest to testowanie czy opóźnione zadanie.Katalog tymczasowy Carrierwave ustawiony na folder uploads/tmp

Jeśli zostanie to zrobione podczas testowania (rspec), pliki tymczasowe będą znajdować się w katalogu RAILS_ROOT/uploads/tmp.

Jeśli to się robi podczas opóźnionego zadania, pliki tymczasowe będą przy RAILS_ROOT/public/uploads/tmp

Najpierw myślałem, że rails_root/tmp/uploads byłoby bardziej sensowne miejsce, lub nawet system folder tymczasowy.

Po drugie, testowanie różniące się od normalnego przebiega jak błąd.

Czy istnieje sposób, aby to naprawić (przez konfigurację lub łatanie małpy)? Czy mogę umieścić rzeczy w folderze RAILS_ROOT/tmp?

Odpowiedz

19

Istnieje opcja config.cache_dir, którą można ustawić w "config/initializers/carrierwave.rb". Ale jest względne w stosunku do "/ public". Wygląda na to, że należy zrobić w swoim uploaderów:

class MyUploader < CarrierWave::Uploader::Base 

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

Działa jak urok. Pamiętaj, że aby to zmienić, konieczne będzie ponowne uruchomienie aplikacji. –

+0

Dodałem również do katalogu 'attr_writer cache_dir' i zmieniłem funkcję na' @cache_dir || Rails.root.join 'tmp/uploads'' pozwala na nadpisywanie na poziomie instancji (przydatne do izolowania plików testowych z plików deweloperskich). – Leo

+0

Jaka jest różnica między katalogiem podręcznym a katalogiem_pakietu? – Jwan622

7

im przy carrierwave 0.10.0 i wydaje się to zachowanie zostało skierowane. Teraz ustawienie cache_dir akceptuje ścieżkę, która jest poza katalogiem publicznym:

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

@ odpowiedź iKindred pracował dla mnie, ale myślałem, że rozwinąć jak mam go do pracy on Rails 4.2.3 z CarrierWave 0,10 0,0:

Gdzie umieścić blok skonfigurować

Jak CarrierWave nie jest częścią Rails, najlepszym miejscem, aby umieścić blok konfiguracyjny, według mojego czytania Rails Guide, to plik inicjujący. Nazwę można wybrać dowolnie, ale musi ona znajdować się w Rails.root/config/initializers. Wybrałem nazwę pliku po module, który konfigurowałem: Rails.root/config/initializers/carrier_wave.rb.

co umieścić w pliku inicjatora

uważam, że przeprowadzanie testów, podczas gdy moja aplikacja Rails jest uruchomiony w trybie development. Po testach wyczyszczam wszystkie pliki, rozłączając ścieżki przechowywania zgodnie z opisem here. Aby to działało bez zakłócania działania plików przechowywanych przez aplikację Railsową w trybie development, ścieżki do przechowywania muszą być oddzielone przez środowisko! Dlatego moja zmodyfikowana wersja odpowiedzi @ iKindred to:

#config/initializers/carrier_wave.rb 
CarrierWave.configure do |config| 
    config.cache_dir = File.join(Rails.root, 'tmp', 'uploads', Rails.env) 
end 
Powiązane problemy