Jak przetworzyć plik YAML?

Chciałbym wiedzieć, jak parsować plik YAML o następującej zawartości:

--- 
javascripts: 
- fo_global:
  - lazyload-min
  - holla-min

Obecnie próbuję to przetworzyć w ten sposób:

@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

Ale to nie wydaje się działać i daje mi błąd, że wartość jest zerowa.

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

Jeśli spróbuję tego, to wystawi cały łańcuch (fo_globallazyload-minholla-min):

if !@custom_asset_packages_yml.nil?
          @custom_asset_packages_yml['javascripts'].each{ |js|
            js['fo_global']
          }
        end
 175
Author: the Tin Man, 2010-10-07

2 answers

Może coś mi umyka, ale po co analizować plik? Dlaczego po prostu nie załadować YAML i sprawdzić obiekt(y) tego wyniku?

Jeśli Twoja próbka jest w some.yml, to:

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

Daje mi

{"javascripts"=>[{"fo_global"=>["lazyload-min", "holla-min"]}]}
 402
Author: Mike Woodhouse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-07 05:32:16

Miałem ten sam problem, ale również chciałem uzyskać zawartość pliku (po YAML front-matter).

To jest najlepsze rozwiązanie jakie znalazłem:

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

Źródło i dyskusja: https://practicingruby.com/articles/tricks-for-working-with-text-and-files

 10
Author: sarfata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-05 09:48:54