【问题标题】:How do I parse a YAML file in Ruby?如何在 Ruby 中解析 YAML 文件?
【发布时间】:2025-12-21 10:35:12
【问题描述】:

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

【问题讨论】:

  • 能否给出运行时脚本的输出?文件在正确的位置?你总是可以启动一个 Rails 控制台,看看 ruby​​ 是否也能看到那条路径。
  • 是的,该文件确实存在并且位于正确的位置。我已经用错误更新了我的帖子。

标签: ruby yaml


【解决方案1】:

也许我遗漏了一些东西,但为什么要尝试解析文件?为什么不直接加载 YAML 并检查生成的对象?

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

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

给我

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

【讨论】:

  • 我同意,这就是 YAML 的美妙之处——我们可以序列化某些内容,然后再将其读回,所以为什么不使用该功能。
  • 啊,我不知道你可以用 YAML 文件做到这一点。非常感谢!
  • 呵呵,那是因为我使用了标签。它似乎只想要空格而不是制表符,然后抛出各种错误。
  • YAML 库中的#load 和#load_file 有什么区别?
  • YAML.load 采用 YAML 字符串,YAML.load_file 采用相对文件路径。
【解决方案2】:

我遇到了同样的问题,但也想获取文件的内容(在 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

【讨论】:

【解决方案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"}}}}}

【讨论】: