web-dev-qa-db-ja.com

railsエラー、YAMLを解析できませんでした

宝石を更新した後、私はこれを持っています:

/home/megas/.rvm/rubies/Ruby-1.9.2-p136/lib/Ruby/1.9.1/psych.rb:148:in `parse': couldn't parse YAML at line 182 column 9 (Psych::SyntaxError)
    from /home/megas/.rvm/rubies/Ruby-1.9.2-p136/lib/Ruby/1.9.1/psych.rb:148:in `parse_stream'
    from /home/megas/.rvm/rubies/Ruby-1.9.2-p136/lib/Ruby/1.9.1/psych.rb:119:in `parse'
    from /home/megas/.rvm/rubies/Ruby-1.9.2-p136/lib/Ruby/1.9.1/psych.rb:106:in `load'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth/formatters/latex.rb:6:in `<module:LATEX>'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth/formatters/latex.rb:3:in `<top (required)>'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth.rb:21:in `require'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth.rb:21:in `<top (required)>'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/case_sensitive_require/RedCloth.rb:6:in `require'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/case_sensitive_require/RedCloth.rb:6:in `<top (required)>'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:68:in `require'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `each'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `block in require'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `each'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `require'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler.rb:120:in `require'
    from /home/megas/Work/railscasts/config/application.rb:10:in `<top (required)>'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/railties-3.0.3/lib/Rails/commands.rb:28:in `require'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/railties-3.0.3/lib/Rails/commands.rb:28:in `block in <top (required)>'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/railties-3.0.3/lib/Rails/commands.rb:27:in `tap'
    from /home/megas/.rvm/gems/Ruby-1.9.2-p136/gems/railties-3.0.3/lib/Rails/commands.rb:27:in `<top (required)>'
    from script/Rails:6:in `require'
    from script/Rails:6:in `<main>'

Ruby-1.9.2-p136 Rails 3.0.3

Gem RedClothを再インストールしようとしましたが、助けにはなりませんでした。システムは4.2.3バージョンのみを使用したいです

それを修正する方法はありますか?ありがとう

76
megas

どこかに無効なYAMLコードがあります。私はPsychでは無効という意味です(新しいRuby YAMLパーサー)。

YAMLコードを修正できない場合(または修正したくない場合)は、古いYAMLパーサー(syck)をロードして、config/boot.rbの先頭に追加してください。

require 'yaml'
YAML::ENGINE.yamler = 'syck'

それはただの「迅速で汚い」修正です、私は知っています

166
vicvega

通常のRails 3アプリでもこの問題が発生しました。これは、日付/時刻にローカライズされたyamlファイルを使用していたためです。

このコミットでわかるように、 https://github.com/Rails/rails/commit/dc94d81 これは、別の行に配列を配置することで簡単に「修正」できます。

         -    order: [ :year, :month, :day ]
    18  +    order:
    19  +      - :year
    20  +      - :month
    21  +      - :day
49
stwienert

Paul Raupachの回答を少し調整して、ディレクトリから実行すると、すべてのサブディレクトリですべての* .ymlファイルを再帰的に見つけて、ファイルをテストします。私はRails root dir。

require 'yaml'

d = Dir["./**/*.yml"]
d.each do |file|
  begin
    puts "checking : #{file}"
    f =  YAML.load_file(file)
  rescue StandardError
    puts "failed to read #{file}: #{$!}"
  end
end
20
Glenn Rempe

根本原因は多くの場所で説明されており、もう一度要約します。

デフォルトのyamlパーサーには2つあり、Psychは新しいものであり、使用すべきものです。 Syckは古いもので、メンテナンスされておらず死にかけ、libyamlが存在しない場合のフォールバックとして現在使用されています(通常は非Linuxシステム)。

重要なことはどこかに無効なyamlがあるです。ほとんどの場合、翻訳ファイルに含まれています(%で囲まれた引用符で囲まれていない文字列がありました)。プロダクションボックスですべてのymlファイルをYAML.load_fileでロードしてみると、どれが壊れているかがわかります。

17
Honza

スペースの代わりにタブを使用していたため、この問題が発生しました

13
flunder

YAMLファイルを修正するのが最善です

irbの使用方法は次のとおりです。したがって、おそらく動作していないRailsコンソールは必要ありません。

require 'yaml'
YAML::ENGINE.yamler = 'psych'
YAML.load_file('config/locales/xxx.en.yml')

問題がどこにあるかを示す素晴らしい出力が得られます:

Psych::SyntaxError: couldn't parse YAML at line 25 column 17
    from /home/xxx/.rvm/rubies/Ruby-1.9.2-p290/lib/Ruby/1.9.1/psych.rb:148:in `parse'
    from /home/xxx/.rvm/rubies/Ruby-1.9.2-p290/lib/Ruby/1.9.1/psych.rb:148:in `parse_stream'
    from /home/xxx/.rvm/rubies/Ruby-1.9.2-p290/lib/Ruby/1.9.1/psych.rb:119:in `parse'
    from /home/xxx/.rvm/rubies/Ruby-1.9.2-p290/lib/Ruby/1.9.1/psych.rb:106:in `load'
    from /home/xxx/.rvm/rubies/Ruby-1.9.2-p290/lib/Ruby/1.9.1/psych.rb:205:in `load_file'
    from (irb):10
    from /home/xxx/.rvm/rubies/Ruby-1.9.2-p290/bin/irb:16:in `<main>'
13

YAMlに強制的に「syck」を使用させることにより、実際の問題を「マスク」するだけでなく、yamlコードを絶対に修正します。これと同じ問題があり、ローカライズファイルで不正なymlステートメントが見つかりました。古いパーサーを使用することを強制する場合、プロジェクトの他の場所で新しいパーサーのすべての作業の利点を得ることができません。

6
FlyboyArt

元の質問の問題はRedClothにありました。私は同じ問題を経験しており、単にRedCloth gemの最新バージョン(現在4.2.7)に更新するだけで問題が修正されました。

HonzaとFlyboyArtからの上記のアドバイスは適切であり、カスタムYAMLを修正する必要がありますが、RedClothが人気を博しているため、RedClothを使用するこの質問を見つけるほとんどのユーザーは、GemFileに次の行を追加する必要があります:

gem 'RedCloth', ">= 4.2.7"
6
tiddy

これを読んでいる他の人のために、データベース構成でタイプミスをした後にこのエラーが発生しました-/config/database.yml

4
David

これはバンドラー1.0.10の問題です。 詳細はこちら

バンドラーをダウンデートしてみてください

3
vicvega

この問題を追求している人のために、password:キーワードとパスワードの間にスペースがないため、私のdatabase.ymlがこのエラーをトリガーしていることがわかりました。ほとんど目に見えないエラー、およびRailsの以前のバージョンでエラーなしで機能していたdatabase.ymlがあります。

2
Anita Graham

私の原因でそれを修正したのは、実際には次の形式の不正なY​​AML翻訳ファイルでした。

config/locales/bg.yml

YAMLの間違いを修正しましたが、すべて問題ありませんでした。 :-)

2
dimitarvp

私の場合、これはバンドルの問題ではありません:(Ruby 1.9が想定されています)

  • Rubyは、デフォルトで、libyamlが存在する場合、 'psych'(Cライブラリにリンクする新しい管理されたyamlライブラリ:libyaml)を使用します。
  • それ以外の場合、Rubyは 'syck'を使用します(古いものであり、メンテナンスされていません)
  • YAML :: ENGINE.yamler = 'syck'は、強制的にRuby 'psych'もインストールされているマシンで 'syck'を使用するように強制します

詳細はこちら: 「yaml」ではデフォルトでpsychを使用しないでください

2
gamov

私が構築しているSinatraアプリで r18nライブラリ を使用していたときにこれに遭遇し、翻訳ファイルには次のものがありました。

day: !!pl
  0: 0 days
  1: 1 day
  n: %1 days

以前のプロジェクトではRuby 1.8.7で正常に動作していましたが、Ruby 1.9.3では失敗していました。

@SBの回答は、問題を解決するために必要な手がかりを与えてくれました。新しいYAMLは%1をしていました。 irbを少し掘り下げて実験したところ、YAMLパーサーの新しいバージョンでは、%1で始まる文字列を引用符で囲む必要があることがわかりました。私の翻訳は

day: !!pl
  0: 0 days
  1: 1 day
  n: "%1 days"

そして出来上がり-厄介なエラーメッセージが消えました。

2
Dave Sag

グループ:developmentおよび:test内にgem psychをインストールすることにより、この問題を修正することができます。

gem 'psych'
2
Thaha kp

この問題がありました。私の問題は、database.ymlファイルに余分なタブがあったことです。

2
Tim

あなたが私のような人で、何百もの備品があるプロジェクト(継承)に直面している場合、数行のRubyで時間を節約できます:

require 'yaml'

d = Dir.new('test/fixtures/')
d.each do |file|
  begin
     f =  YAML.load_file('test/fixtures/' + file)
  rescue StandardError
     puts "failed to read test/fixtures/#{file}: #{$!}"
   end
 end

Rails rootに入れて実行し、完了したらゴミ箱に移動してください。

1
Paul Raupach

私の場合、2つの問題がありました。

  1. @stwienertで述べたように、配列表現は問題でした。
  2. もう1つ、St​​ringが%{var}で始まっている場合、Parse例外を受け取りました。 %{var}で始まることを避けるために、それに応じて文字列を変更する必要がありました

たとえば、文字列が

%{user_name} welcome to %{application_name}-これはエラーを投げた

それを修正するために変更しなければなりませんでした

Hi, %{user_name} welcome to %{application_name}

これが誰かを助けることを願っています。

よろしく、

シャルドゥル。

1
SB.

不正な形式のYAML翻訳ファイルでも同様の問題が発生しました。定義する前に変数を使用しました。次は間違っていました。

...
messages:
  ...
  <<: *errors_messages
...
messages: &errors_messages
...

次のように変更する必要がありました。

...
messages: &errors_messages
...
messages:
  ...
  <<: *errors_messages
...

その後、再び機能し始めました。

1
Remo

精神分析は核心に吸い込まれます。これがエレガントなソリューションであるかどうかはわかりませんが、アンインストールすることでこの問題を解決できます。

gem uninstall psych
1
sovanlandy

後にスペースがあったので、本当に奇妙な問題がありました。例えば。:

title: "NASA"

うまくいきませんでしたが、

title:"NASA"

した。

1
andrewmart.in

database.rbから未使用のデータベースを削除します。 MySQLを使用し、PostgreSQLがない場合は、databases.ymlからPGデータベースコードを削除します。

1
vijay

.ymlファイルのエラーを確認する必要があります。database.ymlで問題が見つかりました

1
chaitanya

Ruby 1.9.2-p180で1.9.2-p290に行くと同じ問題があり、これを解決してくれました。

1
Jakob Cosoroaba

まあ、万が一これが役立つ場合...
私がしたこと:
-すべてを選択し、 https://github.com/svenfuchs/Rails-i18n/tree/master/Rails/locale/es.yml から新しいes.ymlにコピーします。 notepad ++
-この新しいファイルをnetBeans IDEテキストエディターで、utf8(正確なテキストを思い出せない)で安全なロードに関する警告が表示されました)で見ようとしました。このテキストエディタ。
-ローカルスルーconfiguration/application.rb i18nを切り替えました
[。
-IRBに行き、syckでファイルをロードしました。 psychに切り替えて、同じエラーが発生しました。

解決方法:
- https://github.com/svenfuchs/Rails-i18n/tree/master/Rails/locale/es.yml から内容をコピーするために戻ったが、今回は貼り付けたこれは、netBeansエディターで新しく作成されたファイルにあります。
-webRickを再起動しました。
- 問題が解決しました。
宜しくお願いします、
ビクター

1
Victor Maidana

パスワード'p@ssword'を使用してリモートDBに接続しようとするとこのエラーが発生し、psychは'@'記号を好まないことがわかりました。 DBパスワードの変更と問題の解決。

1
wantrapreneur

@Vicvegaによって与えられた答えは、動作する場合と動作しない場合があります(テストしませんでした)RailsおよびRuby共通​​原則 over configuration」であり、この場合の「configuration」は大きくはありませんが、注意して扱う必要があります(さらに共同作業ではさらに)

そのため、YAMLファイルの構文エラーを排除することを提案した人たちに投票します(投票できれば)。

今...エラーを解決するために、私にとってそれは一種の初心者エラーでした、私はConfig/application.rbディレクトリのConfig/localesでデフォルトであると定義したロケールファイルを持っていませんでした

ハッピーコーディング

1
juanm55

これを見ている他の人々のために、私はrerun.txtによって呼び出されていたconfig/cucumber.yml in Rails app。rerun.txtは、最新のキュウリの失敗テストを保存するように構成されており、コンソールでキュウリのテスト用に奇妙な文字を入力しました。

それを見つけるのは大変でした。 グレンレンペの答え 少し前に見たかった。

0
webdevguy

考えられる原因の1つは、このコンテキストでは...行目のマッピング値は許可されていません

これは間違ったYAMLの例です(ユーザー:子項目some_keyとsome_other_keyが含まれているため、実際には値を含めるべきではありません)

customer: Customer
user: User
  some_key: value
  some_other_key: value 2

特に巨大なYAMLファイルがある場合、このような問題を見つけるのは簡単な作業ではありません。

そのようなことを検出するための非常に単純な正規表現を作成しました。 RubyMineで確認しました

^(\s+)['"\w]+:\s?['"\w]+.*\n\1\s\s

注意してください! åøæなどの特殊な文字では正しく動作しません。

それがあなたのために働いたなら、私にコメントで知らせてください:)

0
Serge Seletskyy