2

我有一个简单的 YAML 数组,其值如下

%YAML 1.1
---

-
  - 'd7744c3878'
  - '80705686'
-
  - 'c349b086b1'
  - '80705686'
-
  - '516e25d139'
  - '95203563'

我尝试使用以下代码对其进行迭代并将它们添加到数据库中。

YAML.load_file("db/tokens.yml").each_value do |yml_token|

    token = Token.find_or_create_by_token_origin(
           token_origin: yml_token[0],
           token_value: yml_token[1]) 

end

但是NoMethodError: undefined method each_value for #<String:0x000000059ab7f8> 在尝试运行代码时出现错误。

知道是什么原因造成的吗?

更新:

按照下面的建议使用Psych.load我也会收到SyntaxError: db/gallery_tokens.yml:1: unknown type of %string %YAML 1.1错误消息。

require "psych"
Psych.load("db/tokens.yml").each do |yml_token|

    token = Token.find_or_create_by_token_origin(
           token_origin: yml_token[0],
           token_value: yml_token[1]) 

end
4

1 回答 1

3

顶部的声明“%YAML 1.1”很可能会导致问题。

没有错误:

require "yaml"
YAML.load("---\n\n-\n  - 'd7744c3878'\n  - '80705686'").each
=> #<Enumerator: [["d7744c3878", "80705686"]]:each>

错误:

YAML.load("%YAML 1.1\n---\n\n-\n  - 'd7744c3878'\n  - '80705686'").each
NoMethodError: undefined method `each' for "%YAML 1.1 ---\n- - 'd7744c3878' - '80705686'":String
        from (irb):4
        from /Users/modify/.rvm/rubies/ruby-1.9.2-p180/bin/irb:17:in `<main>'

在这里,我使用的是 ruby​​ 1.9.2p180(2011-02-18 修订版 30909)[i386-darwin9.8.0]。我还注意到,在未修改的环境中,#each_value可用于 aHash但不是Array(@oldergod)。

看起来 Psych(它是 Ruby 后续版本中的默认 YAML 解释器)可以处理该%YAML 1.1指令:

require "psych"
Psych.load("%YAML 1.1\n---\n\n-\n  - 'd7744c3878'\n  - '80705686'").each
=> #<Enumerator: [["d7744c3878", "80705686"]]:each> 

直接使用 Psych 的可能替代方法是切换到更高版本的 Ruby 或%YAML 1.1从文件中删除标题。

于 2012-12-19T05:14:13.990 回答