以下の内容の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
何かが足りないのかもしれませんが、なぜファイルを解析しようとするのでしょうか。なぜYAMLをロードして、結果として得られるオブジェクトを調べないのでしょうか。
あなたのサンプルYAMLがsome.yml
にあるならば、これ:
require 'yaml'
thing = YAML.load_file('some.yml')
puts thing.inspect
私にくれ
{"javascripts"=>[{"fo_global"=>["lazyload-min", "holla-min"]}]}
私は同じ問題を抱えていましたが、ファイルの内容を取得したいと思っていました(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
これは私がターミナルから、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"}}}}}