9

次のようないくつかのエントリを含む YAML ファイルがあります。

001:
  :title: Some title
  :description: Some body text maybe
002:
  :title: Some title
  :description: Some body text maybe

次の Ruby メソッドを使用して、その YAML ファイルを解析して、繰り返し処理できる一連のオブジェクトにします。

def parse_yaml(file)
  YAML::load(File.open(File.join(settings.yaml_folder, file)))
end

def use_yaml
  @items = parse_yaml('items.yml')
  @items.each do |item|
    x = item[1][:title]
    etc...
  end
end

さて、その方法は機能item[1][:title]しますが、繰り返し処理しているオブジェクトの属性にアクセスするために使用する必要があるのは奇妙だと思います。YAML ファイルまたは解析コードをビルドして、より標準的な .xml を使用できるようにするにはどうすればよいitem[:title]ですか?

4

3 に答える 3

8

ハッシュです。parse_yaml出力は次のとおりです。

{ 1=>
      { :title=>"Some title",
        :description=>"Some body text maybe"},
  2=> { :title=>"Some title",
        :description=>"Some body text maybe" }
}

each_value次のような方法を使用できます。

#...
@items = parse_yaml('items.yml')
@items.each_value do |item|
    x = item[:title]
    # ... etc
end

推奨: Ruby の YAML

于 2013-05-01T19:31:19.010 に答える
7

根本的な問題は、YAML ファイルがデータをハッシュとして保存し、配列のようにアクセスしようとしていることです。

データを配列形式に変換するには:

---
- :title: Some title
  :description: Some body text maybe
- :title: Some title
  :description: Some body text maybe

また興味深いことにitem[1][:title]、アイテムを参照するために使用しなければならなかった理由は、キー001002が YAML.load によって整数に変換されるためです。

これは irb で確認できます。

irb(main):015:0> YAML.load(File.open("./test.yml"))
=> {1=>{:title=>"Some title", :description=>"Some body text maybe"}, 2=>{:title=>"Some title", :description=>"Some body text maybe"}}
于 2013-05-01T19:29:58.410 に答える
1

YAML はハッシュのシリアル化であるため、次のことができます。

@items.each do |key, item|
  #do something with item[:title]
end

または、YAML を次のように変更します。

- :title: blah
  :description: description
- :title: second title
  :description: second description

これによりYAML.load、配列が返されます。

于 2013-05-01T19:22:08.610 に答える