2012-03-05 13 views
13

Empecé a usar Carrierwave, y descubrí que almacena archivos temporales en varios lugares, dependiendo de si se trata de un trabajo de prueba o demorado.Carrierwave directorio temporal establecido en la carpeta uploads/tmp

Si se hace durante la prueba (rspec), los archivos temporales estarán en el directorio RAILS_ROOT/uploads/tmp.

Si se hace durante el trabajo de retraso, los archivos temporales estarán en RAILS_ROOT/public/uploads/tmp

En primer lugar, yo estaba pensando que rails_root/tmp/uploads sería un lugar más sensible, o incluso la carpeta temporal del sistema.

En segundo lugar, la prueba es diferente a la ejecución normal parece un error.

¿Hay alguna manera de arreglar esto (ya sea por configuración o parche de mono)? ¿Y puedo poner cosas en la carpeta RAILS_ROOT/tmp?

Respuesta

19

Existe la opción config.cache_dir que puede establecer en 'config/initializers/carrierwave.rb'. Pero es relativo a '/ public'. Parece que debería hacer que en sus cargadores:

class MyUploader < CarrierWave::Uploader::Base 

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

Funciona como un encanto. Tenga en cuenta que deberá reiniciar su aplicación para que esto surta efecto. –

+0

También agregué 'attr_writer cache_dir' a la clase y cambié la función a' @cache_dir || Rails.root.join 'tmp/uploads'' para permitir anulaciones por instancia (útil para aislar archivos de prueba de archivos de desarrollo). – Leo

+0

¿Cuál es la diferencia entre cache_dir y store_dir? – Jwan622

7

Im usando carrierwave 0.10.0 y parece que este comportamiento se abordó. Ahora el ajuste cache_dir acepta un camino que está fuera del directorio público:

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

@ respuesta de iKindred trabajó para mí, pero pensé que me gustaría extenderme sobre cómo llegué a trabajar en los carriles 4.2.3 con CarrierWave 0,10 0.0:

dónde colocar el bloque de configuración

Como CarrierWave no es parte de los carriles, el mejor lugar para poner el bloque de configuración, de acuerdo con mi lectura de la Rails Guide, es un fichero de inicialización. El nombre puede elegirse arbitrariamente, pero debe residir en Rails.root/config/initializers. Elegí nombrar el archivo después del módulo que estaba configurando: Rails.root/config/initializers/carrier_wave.rb.

qué poner en el fichero de inicialización

Me parece que corro pruebas mientras mi Rails aplicación se está ejecutando en modo de development. Después de las pruebas, limpio todos los archivos desvinculándolos de las rutas de almacenamiento descritas en here. Para que eso funcione sin interferir con los archivos almacenados por la aplicación Rails que se ejecuta en el modo development, las rutas de almacenamiento deben estar separadas por el entorno. Por lo tanto, mi versión modificada de la respuesta de @IKindred es:

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