2013-04-29 19 views
6

Używam pliku YAML do przechowywania poufnych danych konfiguracyjnych. Używam tego pliku w środowisku programistycznym. W produkcji używam zmiennych ENV.Rescue, jeśli plik YAML nie istnieje lub nie można załadować w Railsach

Oto co robię teraz:

Mam plik konfiguracyjny/confidental.yml, który wygląda tak:

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

Mam config środowisk/pliku/development.rb że (wśród innych rzeczy) mają te linie:

# 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 } 

Moje pytanie brzmi: Jak mogę upewnić się, że plik YAML istnieje i może być załadowany, a jeśli nie rzucać jakiś wyjątek? Gdzie należy to umieścić?

Odpowiedz

8

Dlaczego nie

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

Nawiasem mówiąc myślę, że to jest dobry pomysł, aby umieścić ładowania YAML z konfiguracji do inicjalizatorów. Na przykład

# 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

Dzięki. Wierzę, że config/environments/również inicjuje, prawda? –

+0

Teraz rubocop sugeruje File.exist? (zamiast liczby mnogiej) zamiast File.exists? –

2

Przyjęte rozwiązanie ma sytuacji wyścigu: jeśli plik konfiguracyjny jest usuwane lub przenoszone pomiędzy File.exists? i YAML.load_file, to kod nie zadziała.

Lepszym rozwiązaniem jest próba otwarcia pliku, potem odzyskać z wyjątkiem potem:

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