ruby - 追記 - yml ファイル




どのようにYAMLファイルを解析するのですか? (2)

たぶん私は何かが欠けているかもしれませんが、なぜファイルを解析しようとしますか? YAMLを読み込んで、その結果として得られるオブジェクトを調べるのはなぜですか?

サンプルのYAMLがsome.ymlにある場合は、 some.ymlになります。

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

私に与える

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

私は次の内容で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

私は同じ問題を抱えていただけでなく、ファイルの内容を取得したかったのです(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 : https://practicingruby.com/articles/tricks-for-working-with-text-and-files





yaml