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

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

Есть идея, как это исправить? Благодаря

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Небольшая корректировка ответа Павла Раупаха, который при запуске из каталога находит все *.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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

Лучше всего исправить ваши файлы YAML

Вот как можно использовать irb, поэтому вам не нужна консоль рельсов, которая, вероятно, не работает:

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>'

Ответ 7

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

Ответ 8

Проблема с исходным вопросом была в RedCloth. Я столкнулся с одной и той же проблемой и просто обновил самую последнюю версию жемчуга RedCloth (в настоящее время 4.2.7). Проблема была решена.

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

gem 'RedCloth', ">= 4.2.7"

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

config/locales/bg.yml

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

Ответ 12

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

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

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

Ответ 13

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

Ответ 14

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

Ответ 15

Мне это показалось, поскольку я использовал r18n library в приложении 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"

и voila - отвратительное сообщение об ошибке исчезло.

Ответ 16

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

gem 'psych'

Ответ 17

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

Ответ 18

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

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

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

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

Ответ 19

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

Ответ 20

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

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

Его нужно было изменить на:

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

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

Ответ 21

Я получил эту ошибку от попытки подключиться к удаленному db с паролем '[email protected]' и понял, что психологу не нравится символ '@'. Изменен пароль БД и проблема решена.

Ответ 22

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

Ответ 23

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

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

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

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

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

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

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

Привет,

Shardul.

Ответ 24

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

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

Ответ 25

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

Ответ 26

Анализ Pshych всасывается в ядро. Я не уверен, что это изящное решение, но я могу решить эту проблему, удалив его.

gem uninstall psych

Ответ 27

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

title: "NASA"

Не работает, но

title:"NASA"

ли.

Ответ 28

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

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

Ответ 29

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

Вот некорректный пример 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

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

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