如何在Ruby中解析YAML文件?

如何在Ruby中解析YAML文件?,ruby,yaml,Ruby,Yaml,我想知道如何解析包含以下内容的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") :

我想知道如何解析包含以下内容的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):


也许我遗漏了什么,但是为什么要尝试解析文件呢?为什么不加载YAML并检查生成结果的对象

如果您的示例YAML位于
some.yml
中,那么:

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

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

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

这是我找到的最好的解决方案:

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

来源和讨论:

以下是我使用的一个liner,来自terminal,用于测试yml文件的内容:


你能在运行脚本时给出它的输出吗?文件放在正确的地方?你可以随时启动Rails控制台,看看ruby是否也能看到该路径。是的,文件确实存在,并且位于正确的位置。我用这个错误更新了我的帖子。我同意,这就是YAML的妙处——我们可以序列化一些东西,然后稍后再读回来,所以为什么不使用这个功能呢。啊,我不知道你可以用YAML文件来做这件事。非常感谢!嗯,那是因为我在用标签。似乎它只需要空格而不是制表符,然后抛出各种各样的错误。YAML库中的#load和#load#u file有什么区别?
YAML.load
采用YAML字符串,
YAML.load_file
采用相对文件路径。Link现在似乎是感谢@devstuf-我已经更新了答案中的链接。
if (md = contents.match(/^(?<metadata>---\s*\n.*?\n?)^(---\s*$\n?)/m))
  self.contents = md.post_match
  self.metadata = YAML.load(md[:metadata])
end
$ 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"}}}}}