为什么这个YAML语法不正确?

时间:2012-02-14 23:41:00

标签: ruby-on-rails ruby-on-rails-3 yaml

我在Ruby on Rails中运行一个程序,并在YAML中设置了一组哈希。我得到一个ArgumentError显然是因为在同一行上有一个开口花括号,作为前一个哈希的右括号。

例如,我有:

features: [
  {
    name: lorem ipsum,
    bullets: [
      "bullet 1",
      "bullet 2"
    ]
  },{
    name: lorem ipsum 2,
    bullets: [
    ...
  }
]

它给了我错误。但是,当我将开口花括号放在一个新的行上时:

  },
  {
    name: lorem ipsum 2,
    ...

它工作正常。

我正在使用Ruby v.1.8.7,Rails v.3.2.1和Rails Config v.2.2.4读取YAML文件并在我的应用程序中访问它。

如何让YAML接受我的语法,而不采用后一种方法?

3 个答案:

答案 0 :(得分:7)

YAML不使用大括号,括号等。相反,所有内容都将按原样解析为哈希值,您只需在列表项前面插入连字符:

features:
- name: lorem ipsum
  bullets:
  - bullet 1
  - bullet 2
- name: lorem ipsum 2
  bullets:
  - ...

加载此内容即可:

{"features"=>[
  {
    "name"=>"lorem ipsum", 
    "bullets"=>["bullet 1", "bullet 2"]
  },
  {
    "name"=>"lorem ipsum 2",
    "bullets"=>["..."]
  }
]}

答案 1 :(得分:3)

Ruby 1.8使用Syck库来解析yaml,它只实现了YAML规范的1.0版(并且还没有维护等)。

使用支持yaml规范1.1版的更新的YAML解析器(例如psych,可在ruby 1.9中使用),您的文件将解析。只是做

require 'psych'
require 'yaml'

确保您使用心理(检查YAML::ENGINE的值)。虽然

看起来不像红宝石1.8可用 然而,至少在红宝石世界中,看起来有点不寻常--​​Dylan重新格式化它更为常见。 根据{{​​3}} yaml,这些日子实际上是JSON的超集(它已经过了我!)

答案 2 :(得分:2)

问题中的YAML不是惯用语,但实际上它几乎是合法的。 YAML在第8行中缺少的列表中的逗号后面需要一个空格。

更正了YAML:

features: [
  {
    name: lorem ipsum,
    bullets: [
      "bullet 1",
      "bullet 2"
    ]
  }, {
    name: lorem ipsum 2,
    bullets: []
  }
]