繁体   English   中英

救援YAML文件不存在或无法在Rails中加载

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM