2013-04-29 4 views
6

में लोड नहीं हो सकती है तो मैं कुछ गोपनीय कॉन्फ़िगरेशन डेटा संग्रहीत करने के लिए एक YAML फ़ाइल का उपयोग कर रहा हूं। मैं बस उस फाइल का उपयोग विकास पर्यावरण में कर रहा हूं। उत्पादन में मैं एनएनवी चर का उपयोग कर रहा हूँ।बचाव यदि YAML फ़ाइल मौजूद नहीं है या रेल

यहाँ अभी मैं क्या कर रहा हूँ है:

मैं एक config/confidental.yml फ़ाइल है, कि इस तरह दिखता है:

email: 
    user_name: 'my_user' 
    password: 'my_passw' 

मैं एक config/वातावरण/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 

वैसे मुझे लगता है कि यह यह एक अच्छा विचार initializers के विन्यास के साथ लोड हो रहा है 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

धन्यवाद:

एक बेहतर समाधान तो पहली फ़ाइल खोलने का प्रयास करने, बाद में अपवाद से उबरने है। मुझे विश्वास है कि कॉन्फ़िगरेशन/वातावरण/शुरुआती भी हैं, है ना? –

+0

rubocop अब File.exist का सुझाव देता है? (बहुवचन नहीं) File.exists के बजाय? –

2

के लिए स्वीकार कर लिया समाधान एक रेस स्थिति है: अगर कॉन्फ़िग फ़ाइल को नष्ट कर दिया या File.exists? और YAML.load_file के बीच में ले जाया जाता है, तो कोड असफल हो जायेगी।

begin 
    PROJECT = YAML.load_file("#{Rails.root}/config/project.yml") 
rescue Errno::ENOENT 
    PROJECT = {} 
end 
संबंधित मुद्दे