如何在Ruby中解析YAML文件?


210

我想知道如何解析具有以下内容的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

但这似乎无效,并且给我一个错误,该值为nil。

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

1
您可以在运行时提供脚本的输出吗?文件放在正确的位置?您可以随时启动Rails控制台,并查看ruby是否也可以看到该路径。
卢卡斯2010年

是的,该文件确实存在并且位于正确的位置。我已经用错误更新了我的帖子。
alvincrespo

Answers:


449

也许我丢失了一些东西,但是为什么要尝试解析文件?为什么不只加载YAML并检查结果对象呢?

如果您的示例YAML位于中some.yml,则此操作:

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

给我

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

9
我同意,这对YAML来说是很棒的-我们可以序列化某些内容,然后稍后再读回,所以为什么不使用该功能。
Tin Man

啊,我没有意识到您可以使用YAML文件来做到这一点。非常感谢!
alvincrespo

1
,是因为我正在使用标签。似乎只需要空格而不是制表符,然后引发各种错误。
FilBot3 2014年

3
YAML库中的#load和#load_file有什么区别?
Jwan622 '16

3
YAML.load采用YAML字符串,YAML.load_file采用相对文件路径。
Narfanator '16

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


1
链接现在似乎是practicingruby.com/articles/...
devstuff

感谢@devstuff-我已经更新了答案中的链接。
sarfata

3

这是我从终端使用的一种衬纸,用于测试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"}}}}}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.