2010-10-06 9 views
161

मैं चाहते हैं पता करने के लिए निम्नलिखित सामग्री के साथ एक YAML फ़ाइल पार्स करने के लिए कैसे:मैं वाईएएमएल फ़ाइल कैसे पार्स करूं?

--- 
javascripts: 
- fo_global: 
    - lazyload-min 
    - holla-min 

वर्तमान में मैं इसे इस तरह पार्स करने के लिए कोशिश कर रहा हूँ:

@custom_asset_packages_yml = (File.exists?("#{RAILS_ROOT}/config/asset_packages.yml") ? YAML.load_file("#{RAILS_ROOT}/config/asset_packages.yml") : nil) 
    if [email protected]_asset_packages_yml.nil? 
     @custom_asset_packages_yml['javascripts'].each{ |js| 
     js['fo_global'].each{ |script| 
     script 
     } 
     } 
    end 

लेकिन यह काम करने के लिए प्रतीत नहीं होता और मुझे एक त्रुटि देता है कि मूल्य शून्य है।

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.each 

यदि मैं यह कोशिश है, यह पूरी स्ट्रिंग (fo_globallazyload-minholla-मिनट) डालता है:

if [email protected]_asset_packages_yml.nil? 
      @custom_asset_packages_yml['javascripts'].each{ |js| 
      js['fo_global'] 
      } 
     end 
+1

आप जब आप इसे चलाते स्क्रिप्ट का आउटपुट दे सकते हैं? सही जगह पर फाइलें? आप हमेशा रेल कंसोल को फायर कर सकते हैं और देख सकते हैं कि रूबी उस पथ को भी देख सकती है या नहीं। – Lukas

+0

हाँ, फ़ाइल मौजूद है और सही स्थान पर है। मैंने अपनी पोस्ट को त्रुटि के साथ अपडेट किया। – alvincrespo

उत्तर

380

शायद मैं कुछ याद कर रहा हूँ, लेकिन क्यों फ़ाइल को पार्स करने की कोशिश? क्यों न केवल वाईएएमएल लोड करें और परिणामस्वरूप ऑब्जेक्ट की जांच करें?

अपने नमूना YAML some.yml में है, तो यह:

require 'yaml' 
thing = YAML.load_file('some.yml') 
puts thing.inspect 

मुझे

{"javascripts"=>[{"fo_global"=>["lazyload-min", "holla-min"]}]} 
+8

मैं मानता हूं, यह वाईएएमएल के बारे में अद्भुत है - हम कुछ क्रमबद्ध कर सकते हैं और बाद में इसे वापस पढ़ सकते हैं, तो उस क्षमता का उपयोग क्यों न करें। –

+0

आह, मुझे पता नहीं था कि आप इसे YAML फ़ाइल के साथ कर सकते हैं। बहुत बहुत धन्यवाद! – alvincrespo

+0

किसी कारण से, मुझे यमल की आवश्यकता हो सकती है, लेकिन मुझे एक पार्स त्रुटि मिलती है, तो मुझे साइको के बारे में कुछ दिखाई देता है। फिर जब मैं Psych.load ("file.yml") करता हूं, तो यह सिर्फ "file.yml" भाग को आउटपुट करता है और फ़ाइल की वास्तविक सामग्री नहीं। – Pred

10

देता है मैं एक ही समस्या थी लेकिन यह भी (फ़ाइल की सामग्री YAML के बाद प्राप्त करना चाहता था सामने की बात)।

यह है सबसे अच्छा समाधान मैं पाया है:

if (md = contents.match(/^(?<metadata>---\s*\n.*?\n?)^(---\s*$\n?)/m)) 
    self.contents = md.post_match 
    self.metadata = YAML.load(md[:metadata]) 
end 

स्रोत और चर्चा: https://practicingruby.com/articles/shared/zmkztdzucsgv