2011-08-04 21 views
7

Me gustaría tener distintas carpetas en mi segmento S3 para mantener la base de datos de producción despejada del entorno de desarrollo. No estoy seguro de cómo hacer esto, aquí está el esqueleto se me ha ocurrido con el inicializador carrierwave:Configurar el entorno para usar diferentes rutas de almacenamiento en Amazon S3 con Carrierwave

if Rails.env.test? or Rails.env.development? 
    CarrierWave.configure do |config| 
    //configure dev storage path 
    end 
end 

if Rails.production? 
    CarrierWave.configure do |config| 
    //configure prod storage path 
    end 
end 
+0

que es bueno (excepto el error tipográfico en el caso de la producción) – apneadiving

+0

OK y ¿cómo se escriben los caminos? Algo como 'config.store_dir = "ruta"'? – PEF

Respuesta

5

Dos opciones:

Opción 1: Usted no se preocupan por la organización de la archivos de modelo ID

En su carrierwave.rb inicializador:

Rails.env.production? ? (primary_folder = "production") : (primary_folder = "test") 

CarrierWave.configure do |config| 
    # stores in either "production/..." or "test/..." folders 
    config.store_dir = "#{primary_folder}/uploads/images" 
end 

Opción 2: SI le importa organizar los archivos por ID de modelo (es decir, ID de usuario)

En el archivo de cargador (es decir image_uploader.rb dentro del directorio uploaders):

class ImageUploader < CarrierWave::Uploader::Base 

    ... 

    # Override the directory where uploaded files will be stored. 
    def store_dir 
    Rails.env.production? ? (primary_folder = "production") : (primary_folder = "test") 

    # stores in either "production/..." or "test/..." folders 
    "#{primary_folder}/uploads/images/#{model.id}" 
    end 

    ... 

end 
+0

¿Está bien y cómo escribiría la configuración de la ruta? Algo así como 'config.store_dir =" path "'? – PEF

+0

Actualicé mi respuesta para darle dos opciones – iwasrobbed

+0

¡Funciona muy bien! Gracias – PEF

0

utilizar diferentes cubos Amazon S3 para sus diferentes entornos. En sus diversos archivos .rb de entorno, establezca el entorno específico asset_host. Entonces puede evitar detectar el entorno Rails en su cargador.

Por ejemplo, en production.rb:

config.action_controller.asset_host = "production_bucket_name.s3.amazonaws.com" 

El asset_host en development.rb se convierte en:

config.action_controller.asset_host = "development_bucket_name.s3.amazonaws.com" 

etc.

(también considerar el uso de un CDN lugar de alojamiento directamente de S3).

A continuación, el cargador se convierte en:

class ImageUploader < CarrierWave::Uploader::Base 

    ... 

    # Override the directory where uploaded files will be stored. 
    def store_dir 
    "uploads/images/#{model.id}" 
    end 

    ... 

end 

Esta es una técnica mejor desde el punto de vista de la replicación de la producción en sus diversos otros entornos.

+0

¿Dónde se lee realmente asset_host? ¿Tiene que cargarlo usted mismo o Carrier Wave lo detecta automáticamente? –

2

Considere lo siguiente inicializador:

#config/initializers/carrierwave.rb 

CarrierWave.configure do |config| 
    config.enable_processing = true 

    # For testing, upload files to local `tmp` folder. 
    if Rails.env.test? 
    config.storage = :file 
    config.root = "#{Rails.root}/tmp/" 
    elsif Rails.env.development? 
    config.storage = :file 
    config.root = "#{Rails.root}/public/" 
    else #staging, production 
    config.fog_credentials = { 
     :provider    => 'AWS', 
     :aws_access_key_id  => ENV['S3_KEY'], 
     :aws_secret_access_key => ENV['S3_SECRET'] 
    } 
    config.cache_dir = "#{Rails.root}/tmp/uploads" # To let CarrierWave work on heroku 
    config.fog_directory = ENV['S3_BUCKET'] 
    config.fog_public  = false 
    config.storage = :fog 
    end 
end 
  • En el desarrollo, los archivos son enviados al directorio público local.
  • En modo de prueba, en el directorio Rails tmp.
  • Y, por último, en el entorno "else" (que generalmente es un entorno de producción o de transición) dirigimos los archivos a S3 utilizando Variables ambientales para determinar qué depósito y credenciales de AWS usar.
Cuestiones relacionadas