我正在使用YAML文件来存储一些机密配置数据。我只是在开发环境中使用该文件。在生产中我使用ENV变量。
这就是我现在正在做的事情:
我有一个config / confidenceal.yml文件,如下所示:
email:
user_name: 'my_user'
password: 'my_passw'
我有一个config / environments / 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文件存在并且可以加载,如果没有抛出异常?应该放在哪里?
答案 0 :(得分:9)
为什么不
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
答案 1 :(得分:6)
接受的解决方案存在竞争条件:如果配置文件被删除或在File.exists?
和YAML.load_file
之间移动,则代码将失败。
更好的解决方案是首先尝试打开文件,然后从异常中恢复:
begin
PROJECT = YAML.load_file("#{Rails.root}/config/project.yml")
rescue Errno::ENOENT
PROJECT = {}
end