2

次のような YML ファイルがあるとします。

en:
  thanksgiving:
    turkey: 'Turkey'
    stuffing: 'Stuffing'
  christmas:
    ham: 'Bring ham'
  thanksgiving:
    beer: 'lots of beer'

Ruby を使用して、基本的にその YML を次のように読み取り、統合し、書き換えます。

en:
  thanksgiving:
    turkey: 'Turkey'
    stuffing: 'Stuffing'
    beer: 'lots of beer'
  christmas:
    ham: 'Bring ham'

これを実現するための最も最善/最も効率的な方法は何ですか?

4

1 に答える 1

1

ノード表現を取得するには、ファイルを解析する必要があります。

yml = YAML.parse( open('c:\temp\foo.yml'))

yml変数には構造全体が含まれます。例: 次のように入力すると、実際のファイル コンテンツ全体が出力されます。

pp yml 

結果を調べた後、安全なシリアライザーを書くことができました。というファイルを追加します。config/initializers/yaml.rb

module YAML

  def YAML.safe_load(file_name)
    YAML::safe_load_node(YAML::parse(IO.read(file_name)))
  end

  def YAML.safe_load_node(input)
    case input.kind
    when :map
      {}.tap do |h|
        input.value.each do |key, node|
          k,v = key.value, YAML::safe_load_node(node)
          if (v.is_a?(Hash) and h[k].is_a?(Hash))
            h[k] = h[k].merge(v)
          elsif (v.is_a?(Array) and h[k].is_a?(Array))
            h[k] = h[k] + v
          else
            h[k] = v
          end
        end
      end
    when :seq
      input.value.map{|node| YAML::safe_load_node(node)}
    when :scalar
      input.value
    end
  end

end 

Railsコンソールで:

>> y YAML::safe_load('c:/temp/test.yml')
---
en:
  christmas:
    ham: Bring ham
  thanksgiving:
    turkey: Turkey
    stuffing: Stuffing
    beer: lots of beer
于 2012-06-08T02:26:56.833 に答える