2013-05-01 1 views
7

私は次のようになり、いくつかのエントリを持つYAMLファイルを持っている:私は反復処理できるオブジェクトのセットにそのYAMLファイルを解析するために、次のRubyのメソッドを使用していYAMLをハッシュ/オブジェクトに解析するにはどうすればよいですか?

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

を:

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]を使用する必要があります。もっと標準のitem[:title]を使用できるように私のYAMLファイルや解析コードをビルドするにはどうすればいいですか?あなたができるよう

答えて

8

それはハッシュです。 parse_yaml出力は次のようになります。

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

お勧め:YAML for Ruby

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

あなたはこのようなeach_valueメソッドを使用すること

1

あなたのYAMLはハッシュの連載です:

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

かのように見えるためにあなたのYAMLを変更します。配列を返すYAML.loadになりますどの

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

3

基本的な問題は、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"}} 
関連する問題