2013-04-29 2 views
6

Я использую файл YAML для хранения конфиденциальных данных конфигурации. Я просто использую этот файл в среде разработки. В производстве я использую переменные ENV.Спасение, если файл YAML не существует или не может быть загружен в Rails

Вот что я делаю прямо сейчас:

У меня есть конфигурационный/confidental.yml файл, который выглядит следующим образом:

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

У меня есть конфиг/сред/файл development.rb что (среди других вещей) есть такие строки:

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

Мой вопрос: Как я могу убедиться, что файл YAML существует и может быть загружен, и если не проливает исключение? Где это должно быть поставлено?

ответ

8

Почему не

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

Кстати, я думаю, что это, что это хорошая идея, чтобы положить загрузки YAML с конфигурацией инициализаторов. Например

# 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

Спасибо. Я считаю, config/environment/тоже инициализаторы, верно? –

+0

rubocop теперь предлагает File.exist? (а не множественное число) вместо File.exists? –

2

Принятое решение имеет состояние гонки: если конфигурационный файл будет удален или перемещен между File.exists? и YAML.load_file, то код потерпит неудачу.

Лучшее решение заключается в попытке открыть файл, а затем восстановить из исключения после этого:

begin 
    PROJECT = YAML.load_file("#{Rails.root}/config/project.yml") 
rescue Errno::ENOENT 
    PROJECT = {} 
end 
Смежные вопросы