【问题标题】:NoMethodError: undefined method `each_value' when parsing YAML arrayNoMethodError:解析 YAML 数组时未定义方法“each_value”
【发布时间】:2012-12-19 05:04:30
【问题描述】:

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

【问题讨论】:

  • 检查YAML.load_file("db/tokens.yml")会得到什么?
  • 我得到了整个 YAML 数组。
  • each_value 不存在于Arrays,这是用于Hashes。
  • @oldergod 我应该改用什么?
  • 如果你要解析硬盘上的文件,你需要调用Psych.load_file

标签: ruby-on-rails ruby yaml


【解决方案1】:

顶部的声明“%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 可用于 Hash,但不适用于 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 标头。

【讨论】:

  • 那么,我应该改用什么?
  • @Martin:看起来有几个选项——看我的编辑。
  • 使用 psych 我得到这个错误SyntaxError: db/tokens.yml:1: unknown type of %string %YAML 1.1 ^
  • @Martin:你用的是什么版本的 Psych 和 Ruby?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2014-12-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多