1. ホーム
  2. ルビー

[解決済み】RubyでYAMLファイルをパースするには?

2022-04-06 16:08:25

質問

以下の内容の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"]}]}