J'aimerais savoir comment analyser un fichier YAML avec le contenu suivant:
---
javascripts:
- fo_global:
- lazyload-min
- holla-min
J'essaie actuellement de l'analyser de la manière suivante:
@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
Mais cela ne semble pas fonctionner et me donne une erreur que la valeur est nulle.
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 j'essaye cela, il met toute la chaîne (fo_globallazyload-minholla-min):
if !@custom_asset_packages_yml.nil?
@custom_asset_packages_yml['javascripts'].each{ |js|
js['fo_global']
}
end
Peut-être qu'il me manque quelque chose, mais pourquoi essayer d'analyser le fichier? Pourquoi ne pas simplement charger le YAML et examiner le ou les objets qui en résultent?
Si votre échantillon YAML est dans some.yml
, alors ceci:
require 'yaml'
thing = YAML.load_file('some.yml')
puts thing.inspect
donne moi
{"javascripts"=>[{"fo_global"=>["lazyload-min", "holla-min"]}]}
J'ai eu le même problème, mais je voulais aussi obtenir le contenu du fichier (après l’avant-plan YAML).
C'est la meilleure solution que j'ai trouvée:
if (md = contents.match(/^(?<metadata>---\s*\n.*?\n?)^(---\s*$\n?)/m))
self.contents = md.post_match
self.metadata = YAML.load(md[:metadata])
end
Source et discussion: https://practicingruby.com/articles/tricks-for-working-with-text-and-files
Voici la ligne que j’utilise, depuis terminal, pour tester le contenu des fichiers 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"}}}}}