Ruby 如何将YAML解析为哈希/对象?

Ruby 如何将YAML解析为哈希/对象?,ruby,yaml,Ruby,Yaml,我有一个YAML文件,其中有几个条目如下所示: 001: :title: Some title :description: Some body text maybe 002: :title: Some title :description: Some body text maybe #... @items = parse_yaml('items.yml') @items.each_value do |item| x = item[:title] # ... et

我有一个YAML文件,其中有几个条目如下所示:

001:
  :title: Some title
  :description: Some body text maybe
002:
  :title: Some title
  :description: Some body text maybe
#...
@items = parse_yaml('items.yml')
@items.each_value do |item|
    x = item[:title]
    # ... etc
end
我使用以下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文件或解析代码,以便使用更标准的
项[:title]

您的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
返回一个数组。

根本问题是YAML文件将数据存储为散列,并试图像数组一样访问它

要将数据转换为数组格式,请执行以下操作:

---
- :title: Some title
  :description: Some body text maybe
- :title: Some title
  :description: Some body text maybe
同样值得注意的是,您必须使用
item[1][:title]
引用项目的原因是,键
001
002
由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"}}

这是一个杂烩。
parse_yaml
输出为:

{ 1=>
      { :title=>"Some title",
        :description=>"Some body text maybe"},
  2=> { :title=>"Some title",
        :description=>"Some body text maybe" }
}
您可以使用以下方法:

001:
  :title: Some title
  :description: Some body text maybe
002:
  :title: Some title
  :description: Some body text maybe
#...
@items = parse_yaml('items.yml')
@items.each_value do |item|
    x = item[:title]
    # ... etc
end
建议: