2013-05-01 14 views
7

Ich habe eine YAML-Datei mit ein paar Einträge, die wie folgt aussehen:Wie analysiere ich YAML in ein Hash/Objekt?

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

ich die folgende Ruby-Methode, die YAML-Datei in eine Menge von Objekten zu analysieren ich iterieren kann:

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 
Jetzt

, funktioniert diese Methode, aber ich finde es sonderbar, dass ich item[1][:title] verwenden, um die Attribute des Objekts zugreifen ich bin iterieren. Wie kann ich meine YAML-Datei oder meinen Parsing-Code erstellen, damit ich den Standard item[:title] verwenden kann?

Antwort

8

Es ist ein Hash. Die parse_yaml Ausgabe lautet:

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

Sie können die each_value Methode wie folgt verwenden:

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

Recomend: YAML for Ruby

1

Ihre YAML ist die Serialisierung eines Hash, so dass Sie tun können:

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

Oder Ihr YAML aussehen ändern:

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

die in YAML.load Rückkehr ein Array führen.

3

Das zugrunde liegende Problem ist, dass Ihre YAML-Datei Ihre Daten als Hash speichert und versucht, wie ein Array darauf zuzugreifen.

Um Ihre Daten in einem Array-Format zu konvertieren:

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

Auch interessant, den Grund müssen man beachten, item[1][:title] benutzen, um Ihre Produkte zu verweisen ist, dass die Schlüssel 001 und 002 auf ganze Zahlen von YAML.load umgewandelt werden .

Sie können dies in irb bestätigen:

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"}}