[英]Rescue if YAML file doesn't exist or can't load in Rails
我正在使用YAML文件存储一些机密配置数据。 我只是在开发环境中使用该文件。 在生产中,我正在使用ENV变量。
这是我现在正在做的事情:
我有一个config / confidental.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文件存在并可以加载,如果没有抛出异常? 那应该放在哪里?
为什么不
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
接受的解决方案具有竞争条件:是否在File.exists?
之间删除配置文件或在其中移动配置文件File.exists?
和YAML.load_file
,那么代码将失败。
更好的解决方案是先尝试打开文件,然后再从异常中恢复:
begin
PROJECT = YAML.load_file("#{Rails.root}/config/project.yml")
rescue Errno::ENOENT
PROJECT = {}
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.