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



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



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

662   29  

29 ответов:

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

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

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

это просто "быстро и грязно" исправить, я знаю

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

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

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

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

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

есть два по умолчанию yaml parser 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>'

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

проблема с исходным вопросом была в RedCloth. Я испытывал ту же проблему и просто обновился до самой последней версии redcloth gem (в настоящее время 4.2.7) Исправлена проблема.

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

gem 'RedCloth', ">= 4.2.7"

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

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

попробуйте просто понизить bundler

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

config/locales/bg.yml

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

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

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

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

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

, который работал просто отлично в старом проекте под Ruby 1.8.7, но который провалился под Ruby 1.9.3.

ответ @SB дал мне ключ, который мне нужен, чтобы решить мою проблему. Новый ЯМЛ упирался в %1. Некоторые быстро копать и эксперимент с irb и теперь я знаю, что более новая версия YAML parser требует, чтобы вы ставили кавычки вокруг строк, которые начинаются с %1, так что я просто изменил свой перевод, чтобы быть

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

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

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

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

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

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

gem 'psych'

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

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

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

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

удачи в кодировании

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

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

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

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

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

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

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

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

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

например, если строка

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

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

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

надеюсь, что это помогает кому-то.

С уважением,

Shardul.

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

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

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

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

gem uninstall psych

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

title: "NASA"

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

title:"NASA"

сделал.

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

для других людей, глядя на это, я нашел этот вопрос в 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\s\s

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

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

Comments

    Ничего не найдено.