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_valueHashArray(@oldergod) では使用できますが、では使用できないことにも注意してください。

それ以降のバージョンの Ruby ではデフォルトの YAML インタープリターである Psych が%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 に答える