8

Ciò che era iniziato come un fastidio minore ora si è trasformato in un mal di testa. Sto costruendo un'app Rails 4 e sto usando Foreman per la mia configurazione di sviluppo con un Procfile e un file .env per la configurazione. Quando imposto una variabile ENV nel file .env, questa viene prelevata correttamente dalla mia app. In questo caso sto impostando alcune opzioni ENV per Paperclip in un inizializzatore.Perché gli inizializzatori di My Rails memorizzano nella cache le variabili ENV (Foreman, Dev env)

Il problema emerge quando vado a modificare il valore delle variabili ENV. Nella console, se digito ENV ["MY_VAR"], mostra il nuovo valore. Tuttavia, il valore che è stato usato nel mio inizializzatore, che presumibilmente è stato eseguito quando ho avviato la console, mostra il vecchio valore! Da nessuna parte nel mio progetto è il vecchio valore elencato ovunque. Questo mi porta a credere che l'ambiente sia in qualche modo memorizzato nella cache o che le variabili env vengano esportate nella mia shell. Sono a corto di posti per guardare in modo che qualsiasi aiuto sarebbe molto apprezzato! Sto sviluppando su Mac (10.9.4) con Ruby 1.9.3-p374 e Rails 4.1.0.

Esempio:

ROOT/.env

S3_BUCKET=mybucket 

config/inizializzatori/paperclip.rb

Paperclip::Attachment.default_options[:s3_credentials] = {bucket: ENV["S3_BUCKET"]} 

Se cambio il valore di S3_BUCKET al caposquadra "newbucket" e fuggi" run rails c "o" rails c "per accedere alla console, questo è ciò che accade:

ENV["S3_BUCKET"] # => "newbucket" 
Paperclip::Attachment.default_options[:s3_credentials] # => {bucket: 'mybucket'} 

Devo dire che questo comportamento si verifica anche nelle mie classi che ho inserito in/lib. Immagino che tutto ciò sia dovuto a qualcosa di stupido che ho trascurato. Qualche idea?

+0

Se si modificano i varg e si desidera che l'applicazione li prelevi, è necessario riavviare l'app. Questo è sempre stato il caso. – nzifnab

+0

Sì, certo. Per chiarire però, DOPO aver riavviato l'app, le modifiche non vengono rilevate negli inizializzatori, ma vengono prelevate nell'hash ENV. – Spencer

+0

Stai usando 'spring' per caso? (Controlla il tuo Gemfile.) – fny

risposta

24

Se stai usando Rails 4 fuori dalla scatola, è dotato di una gemma chiamata Spring che è destinato per rendere la vita più facile per il precaricamento un'istanza della vostra applicazione in background e ricaricarlo il tuo codice e la configurazione i file cambiano.

Spring, tuttavia, monitora solo i file di configurazione predefiniti di Rails, quindi sarà necessario configurare Spring per monitorare altri eventuali file che si desidera attivare una ricarica.

Spring reads ~/.spring.rb e config/spring.rb per le impostazioni personalizzate. È possibile aggiungere aggiungere la seguente riga al file di vostra scelta per guardare il file .env per le modifiche:

Spring.watch '.env' 

Vedi Spring's configuration documentation nel README per maggiori informazioni.

+0

Brillante, grazie! Sembra che avrei dovuto leggere le note di aggiornamento un po 'più attentamente :-). – Spencer

+4

OMFG ... Mi chiedevo perché riavviare la console non avrebbe raccolto le modifiche, anche quando ho cancellato il file flipp'n! Ho dovuto spegnere completamente il terminale. Grazie per questo! Assolutamente esasperante. – manafire

+1

Da quello che posso dire, config/inizializzatori non vengono ricaricati anche con questa correzione. Vedi qui: https://github.com/rails/spring/issues/378 – stevo