Как разобрать файл 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") : nil)
    if [email protected]_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 [email protected]_asset_packages_yml.nil?
          @custom_asset_packages_yml['javascripts'].each{ |js|
            js['fo_global']
          }
        end

Ответ 1

Может, мне что-то не хватает, но зачем пытаться разбирать файл? Почему бы просто не загрузить YAML и не исследовать объект (ы), который будет результатом?

Если ваш образец YAML находится в some.yml, то это:

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

дает мне

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

Ответ 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/shared/zmkztdzucsgv