ошибка рельсов, не удалось разобрать 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>'

рубин-1.9.2-p136 рельсы 3.0.3

Пробовал переустановить гем RedCloth, не помогло, система хочет использовать только версию 4.2.3

Есть идеи, как это исправить? Спасибо


person megas    schedule 12.02.2011    source источник
comment
Каково содержимое рассматриваемого файла YAML? Он говорит, что есть синтаксическая ошибка, поэтому проблема, вероятно, заключается в вашем файле YAML.   -  person BoltClock    schedule 13.02.2011
comment
Я не работаю ни с одним файлом YAML, поэтому предположил, что это чья-то проблема.   -  person megas    schedule 13.02.2011
comment
какую команду ты запускаешь? вы используете РВМ?   -  person Augusto    schedule 13.02.2011
comment
это происходит после любой команды rails console и rails server. да, я использую rvm   -  person megas    schedule 13.02.2011
comment
см. этот коммит github.com/rails/rails/commit/dc94d81   -  person Greg Dan    schedule 03.03.2011
comment
Вы должны отметить stackoverflow.com/questions/ 4980877/ как принято...   -  person lucapette    schedule 20.09.2011
comment
Возможно, вы также захотите убедиться, что у вас есть все пробелы для отступов, без вкладок.   -  person aceofspades    schedule 06.03.2014


Ответы (29)


У вас где-то есть неверный код YAML. Я имею в виду недопустимый для Psych (новый парсер Ruby YAML).

Если вы не можете (или не хотите) исправлять код YAML, попробуйте загрузить старый анализатор YAML (syck), добавив его в начале config/boot.rb

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

Это просто "быстрое и грязное" решение, я знаю

person vicvega    schedule 24.02.2011
comment
Отлично, это работает! Пожалуйста, напишите здесь объяснение, почему эти строки должны быть в проекте (например, в файле «application.rb» уже есть «require» yaml, почему этого недостаточно) - person megas; 24.02.2011
comment
Bundler 1.0.10 по умолчанию загружает Psych как движок YAML. Psych не работает нормально с рельсами (я использую рельсы 3.0.4, и у v3.0.3 была такая же проблема). См. здесь. Решение: явно установить другой движок YAML - person vicvega; 25.02.2011
comment
Ошибка в файле RedCloth-4.2.2/lib/redcloth/formatters/latex_entities.yml. Насколько я понимаю, это было исправлено в более поздних версиях RedCloth, однако версия 4.2.2 по-прежнему является текущей стабильной версией. - person Tim; 09.06.2011
comment
Добавление этого в boot.rb и удаление RedCloth из нашего Gemfile исправили проблему. Спасибо! - person shedd; 10.06.2011
comment
Это устранило мою проблему с тем, что мой файл YAML неправильно загружал ссылки привязки. - person Jeremy Mack; 28.06.2011
comment
Я использую Rails 3.1 с ruby ​​1.9.2 на Ubuntu 11, и у меня была эта проблема, и исправление сработало для меня. - person Michael Durrant; 11.10.2011
comment
Это просто быстрое решение, а не долгосрочное решение. Возможно, у вас есть синтаксические ошибки в некоторых ваших файлах yaml, которые вы должны исправить. - person jonepatr; 22.10.2011
comment
ага - как сказал vicvega - "исправить yaml"... но если вы не хотите :)... Я столкнулся с этим с проблемой resque_schedule, где cron: * * * * * и нужно было поставить кавычки вокруг cron: * * * * * - person Mark Nadig; 08.11.2011
comment
У меня была похожая проблема, и поэтому я прогнал свой YAML через yamllint.com, чтобы узнать, есть ли проблемы. Хотя он сообщил, что YAML действителен, он переформатировал файл. Я заменил свой старый нерабочий YAML этой переформатированной версией, и это сработало. Проблема решена. - person Charles Roper; 11.01.2012
comment
Для всех скептиков: да, исправьте свой YAML, но этот совет бесценен, потому что, если у вас плохой YAML, сериализованный с помощью syck, и вы хотите преобразовать его в правильный YAML, сериализованный с помощью psych, вам понадобится возможность использовать оба парсера во время одного и того же выполнения ruby. - person gtd; 21.02.2012
comment
Для всех, кто говорит: "Исправьте свой YAML"... обратите внимание, что эта ошибка возникает при запуске Rails, и вообще неясно, какой файл YAML вызывает проблему. - person Dogweather; 22.02.2012
comment
Один вопрос: какую версию Ruby вы используете до и после решения этой проблемы? - person Israel; 14.03.2012
comment
@NeoRiddle: я использовал ruby-1.9.2-p290 - person vicvega; 14.03.2012
comment
@CharlesRoper YamlLint сделал это для меня :) - person Bashar Abdullah; 26.05.2012
comment
По-видимому, версия 1.3 psych понимает значения по умолчанию. Возможно :-) Решение: используйте gem 'psych', '›=1.3.2' в Gemfile. - person AlexChaffee; 20.07.2012
comment
Недостатком yamllint.com является то, что последовательность содержимого не сохраняется для хеш-элементов. Понятно, но раздражает. - person Straff; 19.09.2012
comment
Наша очередь delayed_job не была отформатирована должным образом, и рабочий динамометр Heroku давал сбой. После нескольких часов поиска (и безумных клиентов) этот ответ спас меня. - person Dawn Green; 27.06.2016

У моего обычного приложения Rails 3 также была эта проблема, потому что я использовал локализованный файл yaml для даты/времени.

Как видно из этой фиксации https://github.com/rails/rails/commit/dc94d81, это может легко «исправить», поместив массив в отдельные строки.

         -    order: [ :year, :month, :day ]
    18  +    order:
    19  +      - :year
    20  +      - :month
    21  +      - :day
person stwienert    schedule 16.03.2011
comment
Спасибо, искал именно эту проблему и решил ее, хотя это отличается от проблемы вопроса выше :) - person Malte; 21.03.2011
comment
У меня были проблемы с резиной-postgresql.yml, я прошел через редактор, исправив ссылки, как это, это сработало. Остальная конфигурация резины казалась нормальной. - person Rob; 19.09.2011

Небольшая поправка к ответу Пола Раупаха, который при запуске из каталога рекурсивно находит все файлы *.yml во всех подкаталогах и проверяет файл. Я запустил его из корневого каталога Rails.

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
person Glenn Rempe    schedule 24.03.2012

Первопричина была описана во многих местах, и я снова резюмирую ее.

Есть два парсера yaml по умолчанию Psych — это новый, тот, который вы должны использовать. Syck — старый, он не поддерживается и умирает, в настоящее время он используется в качестве запасного варианта, когда нет libyaml (обычно не Linux-системы).

Важно то, что у вас где-то есть недействительный yaml. Скорее всего, он находится в ваших файлах перевода (у меня были строки без кавычек, отмеченные %). Просто попробуйте загрузить все ваши yml-файлы с помощью YAML.load_file в рабочем поле, и вы увидите, какой из них сломан.

person Honza    schedule 02.06.2011
comment
Голосую за это, потому что вы не правы. psych не поддерживает блоки по умолчанию, что технически ближе к стандарту yaml, но нарушает существующее и ожидаемое использование рельсами (среди прочего). IMO ruby ​​должен использовать синтаксический анализатор, который поддерживается и поддерживает существующее использование, даже если это использование далеко от спецификации. Лишь бы такое было. Пока нет, они должны использовать syck. - person Sarah Mei; 05.06.2011
comment
И я также согласен с Сарой. Весь этот переход на pysch был ничем иным, как головной болью без очевидной ценности. Мой недействительный yaml не был недействительным, он просто использовал синтаксис порядка: [ :year, :month, :day ], который всегда был в порядке, насколько я могу судить (или, забота) - person Rob; 19.09.2011
comment
По-видимому, версия 1.3 psych понимает значения по умолчанию. Возможно :-) Решение: используйте gem 'psych', '›=1.3.2' в Gemfile. - person AlexChaffee; 20.07.2012

У меня была эта проблема, потому что я использовал вкладку вместо пробелов

person flunder    schedule 12.11.2011
comment
Да, похоже, мы должны покончить с этим! - person flunder; 30.10.2013
comment
ослеп после того, как посмотрел на файл yml в поисках отсутствующего двоеточия. - person daslicious; 18.08.2016

Лучше всего исправить ваши файлы 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>'
person Christian Sommerauer    schedule 26.01.2012

Абсолютно исправьте свой код yaml, не просто «маскируйте» реальную проблему, заставляя YAMl использовать «syck». У меня была такая же проблема, и я нашел неверные операторы yml в моих файлах локализации. Если вы просто принудительно используете старый синтаксический анализатор, вы не получите преимуществ всей работы над новым синтаксическим анализатором в другом месте вашего проекта.

person FlyboyArt    schedule 29.05.2011
comment
нет никаких преимуществ, которые я могу обнаружить с помощью нового синтаксического анализатора, только загадочные сообщения об ошибках (сейчас я просматриваю Error Unknown в строке 1, столбце 16 файла, в котором нет столбца 16 в строке 1) в явно правильных файлах YAML, которые проанализировано с предыдущей версией psych. Бесконечное исправление ошибок и регрессии — это повестка дня. Так что не хвастайтесь, это бесконечная головная боль. - person Rob; 20.02.2012

Проблема с исходным вопросом была в RedCloth. У меня возникла та же проблема, и простое обновление до самой последней версии драгоценного камня RedCloth (в настоящее время 4.2.7) устранило проблему.

Приведенный выше совет от Honza и FlyboyArt является разумным, и вы должны исправить любой пользовательский YAML, который у вас есть, но, поскольку RedCloth так же популярен, как и сейчас, большинство пользователей, которые задают этот вопрос, которые также используют RedCloth, должны убедиться, что в их GemFile добавлена ​​​​эта строка:

gem 'RedCloth', ">= 4.2.7"
person tiddy    schedule 03.06.2011

Для других, читающих это, я получил эту ошибку после опечатки в моей конфигурации базы данных - /config/database.yml

person David    schedule 28.01.2012
comment
Опечатки включают в себя отсутствие добавления новой строки в конец файла, по-видимому...! - person Alan David Garcia; 13.09.2013

Это проблема сборщика 1.0.10: подробности здесь

Попробуйте просто обновить пакет

person vicvega    schedule 14.02.2011
comment
я использую 1.0.10, вы имеете в виду ждать новой версии? - person megas; 14.02.2011
comment
Я решил вернуться к сборщику 1.0.7. надеюсь это исправят в следующей версии - person vicvega; 15.02.2011
comment
Я использую Bundler версии 1.1.3, и он все еще работает. - person ; 03.04.2012

То, что исправило это в моем случае, действительно было искаженным файлом перевода YAML в:

config/locales/bg.yml

Исправил ошибку YAML, и все было в порядке. :-)

person dimitarvp    schedule 23.02.2011
comment
не помогло, может у меня ошибка в другом YAML файле, как узнать где ошибся YAML файл? - person megas; 23.02.2011

Для тех, кто занимается этой проблемой, я только что обнаружил, что мой файл database.yml вызывает эту ошибку, потому что в нем нет пробела между ключевым словом password: и паролем. Почти незаметная ошибка, и с файлом database.yml, который работал без ошибок на более ранней версии рельсов.

person Anita Graham    schedule 30.11.2011

Я получил эту ошибку при попытке подключиться к удаленной базе данных с паролем 'p@ssword' и понял, что психологу не нравится символ '@'. Сменил пароль БД и проблема решена.

person wantrapreneur    schedule 09.03.2012

У меня была эта проблема. Моя проблема заключалась в том, что у меня была дополнительная вкладка в файле database.yml.

person Tim    schedule 14.05.2012
comment
Я забыл поставить вкладку между Пароль: и «мой пароль» - person E.E.33; 17.06.2012

Я столкнулся с этим, когда использовал библиотеку r18n в Sinatra приложении, которое я создаю, и в моем файл перевода у меня был следующий:

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"

и вуаля - неприятное сообщение об ошибке исчезло.

person Dave Sag    schedule 19.09.2012

В моем случае это не проблема Bundle: (предполагается Ruby 1.9)

  • Ruby по умолчанию использует «псих» (более новая и поддерживаемая библиотека yaml, связанная с библиотекой C: libyaml), если присутствует libyaml
  • В противном случае Ruby использует «syck» (старый и не поддерживаемый).
  • Таким образом, YAML::ENGINE.yamler= 'syck' заставит Ruby использовать 'syck' на машине, где также установлен 'psych'

Подробнее здесь: требовать, чтобы "yaml" не использовал psych по умолчанию

person gamov    schedule 03.05.2011
comment
Спасибо. У меня тоже проблема с redmine. - person user456584; 31.03.2012

Мне удалось решить эту проблему, установив gem psych внутри группы :development и :test.

gem 'psych'
person Thaha kp    schedule 26.06.2013

У меня была такая же проблема с ruby ​​​​1.9.2-p180, переход на 1.9.2-p290 решил это для меня.

person Jakob Cosoroaba    schedule 21.09.2011

Хотя ответ, данный @Vicvega, может работать или не работать (не проверял его), он противоречит общему принципу Rails и Ruby «Соглашение важнее конфигурации», и к нему следует относиться с осторожностью (и даже больше в совместная работа),,,,хоть и "настройка" в данном случае не велика

поэтому мой голос (Если бы я мог голосовать) за тех, кто предложил устранить синтаксические ошибки в файлах YAML.

теперь ... чтобы решить ошибку, для меня это была своего рода ошибка newby, у меня не было файла локали, который я определил по умолчанию в Config/application.rb в моем каталоге Config/locales

счастливое кодирование

person juanm55    schedule 13.10.2011

Нужно проверить файлы .yml на наличие ошибок, я нашел проблему в моей базе данных.yml

person chaitanya    schedule 08.11.2011

У меня была аналогичная проблема с искаженным файлом перевода YAML. Он использовал переменную перед ее определением. Неверным было следующее:

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

Пришлось изменить на:

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

Потом снова начал работать.

person Remo    schedule 08.03.2012

В моем случае было 2 проблемы.

  1. Как упоминал @stwienert, представление массива было проблемой.
  2. Еще одна вещь: если строка начиналась с %{var}, я получал исключение Parse. Мне пришлось соответствующим образом изменить строки, чтобы не начинать с %{var}

Например, если строка была

%{user_name} welcome to %{application_name} -- Это вызвало ошибку

Чтобы исправить это, мне пришлось изменить его на

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

Надеюсь, это поможет кому-то.

С уважением,

Шардул.

person SB.    schedule 14.04.2012
comment
Вы могли бы просто изменить файл YAML, поместив строку в кавычки, чтобы hello: %{user_name} welcome to %{application_name} стало hello: "%{user_name} welcome to %{application_name}" вместо того, чтобы менять ваше предложение, то есть телегу, ведущую лошадь. - person Dave Sag; 19.09.2012

Ну, на всякий случай, это поможет...
Что я сделал:
- выбрал все и скопировал из https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml в новый es.yml с помощью notepad++
- пытался посмотреть этот новый файл в текстовом редакторе IDE netBeans, получил предупреждение о безопасной загрузке с utf8 (точный текст не помню). Следовательно, я не открывал его в этом текстовом редакторе.
- переключил локальный файл через configuration/application.rb i18n
- когда я загрузил страницу irb, я получил "не удалось проанализировать YAML в строке 0, столбце 0", ссылаясь на Psych.
- Пошел в IRB и загрузил файл с syck, все было в порядке; переключился на psych и получил ту же ошибку.

Как я это решил:
- вернулся, чтобы скопировать содержимое из https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml, но на этот раз я вставил его во вновь созданный файл с помощью редактора netBeans.
- перезапустил webRick.
- проблема решена.
С уважением,
Виктор

person Victor Maidana    schedule 29.07.2012

Удалите неиспользуемые базы данных из database.rb. Если вы используете MySQL и PostgreSQL отсутствует, удалите код базы данных PG из databases.yml.

person vijay    schedule 28.09.2012

Пшыч парс отстой насквозь. Я не уверен, что это элегантное решение, но мне удалось решить эту проблему, удалив его.

gem uninstall psych
person sovanlandy    schedule 16.11.2012
comment
Это дает мне следующую ошибку: gem "psych" cannot be uninstalled because it is a default gem - person Paul Verschoor; 22.01.2018

У меня была очень, очень странная проблема, потому что у меня были пробелы после. Например.:

title: "NASA"

Не получилось, но

title:"NASA"

Сделал.

person andrewmart.in    schedule 26.02.2013

Если вы похожи на меня и столкнулись с проектом (унаследованным) с сотнями фикстур, несколько строк 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 и запустите, а когда закончите, удалите его.

person Paul Raupach    schedule 22.03.2012

Для других людей, просматривающих это, я нашел проблему в rerun.txt, которая вызывалась config/cucumber.yml в приложении Rails. rerun.txt был настроен для хранения самого последнего неудачного теста на огурец, и я каким-то образом ввел в консоль странные символы для теста на огурец.

Это было трудно найти. Хотел бы я видеть ответ Гленна Ремпе некоторое время назад.

person webdevguy    schedule 05.11.2013

Одной из возможных причин является сопоставление значений, не разрешенных в этом контексте в строке ...

Вот неправильный пример 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

Будь осторожен! Это не работает со специальными символами, такими как å ø æ и т. д.

Дайте мне знать в комментариях, если это сработало для вас :)

person Serge Seletskyy    schedule 20.02.2014