ruby - usos - yaml caracteristicas
¿Cómo analizo un archivo YAML? (2)
Tal vez me falta algo, ¿pero por qué intentar analizar el archivo? ¿Por qué no simplemente cargar el YAML y examinar los objetos que resultan?
Si su muestra YAML está en some.yml
, entonces esto:
require ''yaml''
thing = YAML.load_file(''some.yml'')
puts thing.inspect
me da
{"javascripts"=>[{"fo_global"=>["lazyload-min", "holla-min"]}]}
Me gustaría saber cómo analizar un archivo YAML con los siguientes contenidos:
---
javascripts:
- fo_global:
- lazyload-min
- holla-min
Actualmente estoy tratando de analizarlo de esta manera:
@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
Pero parece que no funciona y me da un error de que el valor es nulo.
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
Si intento esto, saca la cadena completa (fo_globallazyload-minholla-min):
if !@custom_asset_packages_yml.nil?
@custom_asset_packages_yml[''javascripts''].each{ |js|
js[''fo_global'']
}
end
Tuve el mismo problema, pero también quería obtener el contenido del archivo (después de la portada de YAML).
Esta es la mejor solución que he encontrado:
if (md = contents.match(/^(?<metadata>---/s*/n.*?/n?)^(---/s*$/n?)/m))
self.contents = md.post_match
self.metadata = YAML.load(md[:metadata])
end
Fuente y discusión: https://practicingruby.com/articles/shared/zmkztdzucsgv