2012-03-21 7 views
5

Tengo una aplicación Rails3 que usa Carrierwave y Fog para almacenar datos en el S3 de Amazon. Esta aplicación que estoy desarrollando requiere que permita que cada usuario tenga su propio cubo EC2 seguro. La premisa de la aplicación es que el usuario cree una cuenta (diseño) y generaré un depósito de almacenamiento solo para ese usuario bajo la contraseña y el usuario EC2 de mi aplicación. Basado en la documentación actual, no he visto una forma de tener múltiples cubos ya que esto está configurado en el FOG YML. Me gustaría pedir alternativas para establecer este FOG_DIRECTORY de forma dinámica en función de los atributos del usuario.Dynamic EC2 Bucket Options for Fog/Carrierwave

Sé que hay una manera de administrar carpetas dinámicas, pero esto no funcionará ya que necesito los depósitos dedicados por usuario.

¡Gracias de antemano!

+0

¿Puede explicar por qué no puede usar carpetas dinámicas? ¿Sus usuarios necesitan acceso directo, que no sea a través de su aplicación? Si no, las URL firmadas funcionan bien. –

+0

Actualmente, el Directorio FOG está configurado en mi niebla yml. Me gustaría almacenar una identificación de cubo en un nivel de usuario. Cuando necesite almacenar cierta información, buscaré al usuario y encontraré la identificación del cubo para usar. Mi problema es cómo configurar este directorio de niebla fuera de la configuración yml? – Gregg

Respuesta

3

Suponiendo que sus cubos ya existan. Pruebe lo siguiente:

#config/initializers/carrierwave.rb 

CarrierWave.configure do |config| 
    #...other configuration stuff... 
    config.fog_directory = 'null.example.com' 

    config.fog_host = proc do 
    proc do |file| 
     uploader = file.instance_variable_get :@uploader 
     "http://#{uploader.fog_directory}" 
    end 
    end 
end 

Nota procsos los anidados, a partir de la redacción de la presente documentación para responder a la carrierwave es incorrecta. Si quiere que fog_host sea dinámico, debe ajustar el proceso para que la clase de configuración de carrierwave haga lo correcto.

Aunque fog_directory se establece dinámicamente más tarde. Los frameworks de prueba y tales se quejan si algo no está establecido en el inicializador (si todo funciona correctamente, la configuración siempre se reemplaza).

#app/controllers/application_controller.rb 

before_filter :set_bucket 

def set_bucket 
    CarrierWave.configure do |config| 
    config.fog_directory = "#{current_user.id}.bucket.example.com" 
    end 
end 

Cambia la función set_bucket para que se adapte a la convención de nomenclatura de tu cuchara.

Puede agregar cierta lógica condicional si desea un depósito fijo en desarrollo en lugar de un depósito por usuario.

También this entrada de blog describe otro enfoque.