2013-04-29 16 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 /環境/イニシャライザも正しいと思いますか? –

+0

rubocopがFile.existを提案するようになりましたか? File.existsの代わりに(複数ではない)? –

2

のために受け入れられた解決策は、競合状態を持っています。configファイルが削除またはFile.exists?YAML.load_fileの間で移動させた場合、コードが失敗します。

begin 
    PROJECT = YAML.load_file("#{Rails.root}/config/project.yml") 
rescue Errno::ENOENT 
    PROJECT = {} 
end 
関連する問題