Hom*_*ith 6 ruby yaml config ruby-on-rails
我使用YAML文件来存储一些机密配置数据.我只是在开发环境中使用该文件.在生产中我使用ENV变量.
这就是我现在正在做的事情:
我有一个config/confidenceal.yml文件,看起来像这样:
email:
user_name: 'my_user'
password: 'my_passw'
Run Code Online (Sandbox Code Playgroud)
我有一个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 }
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何确保YAML文件存在并且可以加载,如果没有抛出一些异常?应该放在哪里?
为什么不
unless File.exists? ("#{Rails.root}/config/confidential.yml")
# do what you want (throw exception or something)
end
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我认为将配置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
Run Code Online (Sandbox Code Playgroud)
接受的解决方案有一个竞争条件:如果配置文件被删除或之间移动File.exists?和YAML.load_file,那么代码将失败.
更好的解决方案是首先尝试打开文件,然后从异常中恢复:
begin
PROJECT = YAML.load_file("#{Rails.root}/config/project.yml")
rescue Errno::ENOENT
PROJECT = {}
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4365 次 |
| 最近记录: |