我有一个简单的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
答案 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}}标头。