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 文件或解析代码以允许我使用更标准的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 回答