2012-03-21 9 views
5

Ho un'applicazione Rails3 che utilizza Carrierwave e Fog per archiviare dati su S3 di Amazon. Questa applicazione che sto costruendo richiede che io consenta a ciascun utente di avere il proprio secchio EC2 sicuro. La premessa dell'applicazione è che l'utente creerà un account (ideato) e genererò un bucket di archiviazione solo per quell'utente sotto l'utente e la password EC2 della mia applicazione. Sulla base della documentazione corrente, non ho visto un modo per avere più bucket poiché questo è configurato nel YOG FOG. Vorrei chiedere alternative per impostare questo FOG_DIRECTORY in modo dinamico in base agli attributi dell'utente.Opzioni dinamiche del secchio EC2 per nebbia/Carrierwave

So che esiste un modo per gestire le cartelle dinamiche, ma questo non funzionerà in quanto ho bisogno di bucket dedicati per utente.

Grazie in anticipo!

+0

Puoi spiegare perché non puoi utilizzare le cartelle dinamiche? I tuoi utenti hanno bisogno di un accesso diretto, oltre che attraverso la tua app? In caso contrario, gli URL firmati funzionano alla grande. –

+0

Attualmente la Directory FOG è impostata nella mia nebbia yml. Vorrei memorizzare un ID bucket a livello di utente. Quando ho bisogno di memorizzare alcune informazioni, cercherò l'utente e troverò l'id del bucket da usare. Il mio problema è come impostare questa directory nebbia al di fuori della configurazione yml? – Gregg

risposta

3

Supponendo che i tuoi secchi esistano già. Provare quanto segue:

#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 i procs nidificati, come la scrittura della questa risposta la documentazione per carrierwave non è corretto. Se vuoi che fog_host sia dinamico, devi avvolgere il proc in modo che la classe di configurazione carrierwave faccia la cosa giusta.

Anche se la directory fog_directory è impostata dinamicamente in seguito. I framework di test e simili si lamentano se qualcosa non è impostato nell'inizializzatore (funziona correttamente, l'impostazione è sempre sovrascritta).

#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 

Modificare la funzione set_bucket in base alla convenzione di denominazione del bucket.

È possibile aggiungere una logica condizionale se si desidera un bucket fisso in fase di sviluppo anziché un bucket per utente.

Anche il post di blog this delinea un altro approccio.

Problemi correlati