我如何parsing一个YAML文件?

我想知道如何parsing具有以下内容的YAML文件:

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

目前我正在试图parsing它:

 @custom_asset_packages_yml = (File.exists?("#{RAILS_ROOT}/config/asset_packages.yml") ? YAML.load_file("#{RAILS_ROOT}/config/asset_packages.yml") : nil) if !@custom_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 

如果我尝试这个,它会放出整个string(fo_globallazyload-minholla-min):

 if !@custom_asset_packages_yml.nil? @custom_asset_packages_yml['javascripts'].each{ |js| js['fo_global'] } end 

也许我错过了什么,但为什么试图parsing文件? 为什么不加载YAML并检查导致的对象?

如果你的示例YAML在some.yml ,那么这个:

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

给我

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

我有同样的问题,但也想获得文件的内容(在YAML前面的事情之后)。

这是我find的最好的解决scheme:

 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