2013-04-29 8 views
6

Sto utilizzando un file YAML per memorizzare alcuni dati confidenziali di configurazione. Sto solo usando quel file nell'ambiente di sviluppo. In produzione sto usando le variabili ENV.Rescue se il file YAML non esiste o non può essere caricato in Rails

Ecco quello che sto facendo in questo momento:

Ho un file di configurazione/confidental.yml, che assomiglia a questo:

email: 
    user_name: 'my_user' 
    password: 'my_passw' 

Ho un/ambienti di file di configurazione/development.rb che (tra le altre cose) hanno queste linee:

# Mailer config 
    email_confidential = YAML.load_file("#{Rails.root}/config/confidential.yml")['email'] 
    config.action_mailer.delivery_method = :smtp 
    config.action_mailer.smtp_settings = { 
    :address    => "smtp.gmail.com", 
    :port     => 587, 
    :domain    => 'baci.lindsaar.net', 
    :user_name   => email_confidential['user_name'], 
    :password    => email_confidential['password'], 
    :authentication  => 'plain', 
    :enable_starttls_auto => true } 

la mia domanda è: come avrei potuto fare in modo che il file YAML esiste e può essere caricato, e se non gettare qualche eccezione? Dove dovrebbe essere messo?

risposta

8

Perché non

unless File.exists? ("#{Rails.root}/config/confidential.yml") 
    # do what you want (throw exception or something) 
end 

Tra l'altro penso che questo sia una buona idea mettere carico YAML con la configurazione a inizializzatori. Per esempio

# config/initializers/load_project_config_file.rb 

if File.exists? ("#{Rails.root}/config/project.yml") 
    PROJECT = YAML.load_file("#{Rails.root}/config/project.yml") 
else 
    PROJECT = {} 
end 
+0

Grazie. Credo che anche config/ambienti/siano inizializzatori, giusto? –

+0

rubocop ora suggerisce File.exist? (non plurale) invece di File.exists? –

2

La soluzione accettata è una condizione di competizione: se il file di configurazione viene eliminato o spostato in mezzo File.exists? e YAML.load_file, quindi il codice avrà esito negativo.

Una soluzione migliore è quella di provare ad aprire il file, poi riprendersi dalla un'eccezione in seguito:

begin 
    PROJECT = YAML.load_file("#{Rails.root}/config/project.yml") 
rescue Errno::ENOENT 
    PROJECT = {} 
end