我想知道如何使用以下内容解析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 !@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
如果我试试这个,它会输出整个字符串(fo_globallazyload-minholla-min):
if !@custom_asset_packages_yml.nil?
@custom_asset_packages_yml['javascripts'].each{ |js|
js['fo_global']
}
end
答案 0 :(得分:425)
也许我错过了什么,但为什么要尝试解析文件?为什么不加载YAML并检查产生的对象?
如果你的样本YAML在some.yml
,那么:
require 'yaml'
thing = YAML.load_file('some.yml')
puts thing.inspect
给了我
{"javascripts"=>[{"fo_global"=>["lazyload-min", "holla-min"]}]}
答案 1 :(得分:11)
我遇到了同样的问题,但也想获取文件的内容(在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/tricks-for-working-with-text-and-files
答案 2 :(得分:1)
这是我从终端使用的一种衬纸,用于测试yml文件的内容:
$ ruby -r yaml -r pp -e 'pp YAML.load_file("/Users/za/project/application.yml")'
{"logging"=>
{"path"=>"/var/logs/",
"file"=>"TacoCloud.log",
"level"=>
{"root"=>"WARN", "org"=>{"springframework"=>{"security"=>"DEBUG"}}}}}