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

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

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

29 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

gem 'RedCloth', ">= 4.2.7"

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

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

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

Попробуй просто уложить бандлер

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

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

Больше информации здесь: require "yaml" не использует psych по умолчанию

У меня была эта проблема. У меня была проблема с дополнительной вкладкой в ​​файле database.yml.

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

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

config/locales/bg.yml

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

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

gem 'psych'

Я сталкивался с этим, когда я использовал библиотеку 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"

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

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

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

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

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

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

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

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

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

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

%{user_name} welcome to %{application_name} - это выкинуло ошибку

Чтобы исправить это, я должен был изменить это на

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

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

С Уважением,

Shardul.

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

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

Это должно было быть изменено на:

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

Тогда это начало работать снова.

Ну, на всякий случай это поможет...
Что я сделал:
- выберите все и скопируйте с https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml в новый es.yml с блокнотом ++
- попытался просмотреть этот новый файл в текстовом редакторе IDE netBeans, я получил предупреждение о безопасной загрузке с помощью 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.
- задача решена.
С уважением,
Виктор

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

gem uninstall psych

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

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

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

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

title: "NASA"

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

title:"NASA"

Сделал.

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

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

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

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

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

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

Другие вопросы по тегам