NoMethodError:解析YAML数组时未定义的方法`each_value'

时间:2012-12-19 05:04:31

标签: ruby-on-rails ruby yaml

我有一个简单的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

1 个答案:

答案 0 :(得分: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]。我还注意到,在未经修改的环境中,Hash可用于Array,但不能用于%YAML 1.1(@oldergod)。

看起来像Psych,它是Ruby的后续版本中默认的YAML interepreter,可以处理require "psych" Psych.load("%YAML 1.1\n---\n\n-\n - 'd7744c3878'\n - '80705686'").each => #<Enumerator: [["d7744c3878", "80705686"]]:each> 指令:

%YAML 1.1

直接使用Psych的可能替代方法是切换到更高版本的Ruby或从文件中删除{{1}}标头。