rails错误,无法解析YAML


76

更新了宝石之后,我得到了:

/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版本

知道如何解决吗?谢谢


有问题的YAML文件的内容是什么?它表示存在语法错误,因此问题可能出在您的YAML文件中。
BoltClock

1
我不使用任何YAML文件,因此我认为这是别人的问题。

您正在运行哪个命令?您在使用RVM吗?
奥古斯托

它发生在命令rails console和rails server之后。是的,即时通讯使用rvm
megas

Answers:


166

您在某处有无效的YAML代码。我的意思是对Psych(新的ruby YAML解析器)无效。

如果您无法(或不想)修复您的YAML代码,请尝试加载旧的YAML分析器(syck),并将其添加到 config/boot.rb

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

我知道这只是“快速而肮脏的”修复


20
默认情况下,Bundler 1.0.10将Psych作为YAML引擎加载。Psych无法在Rails上正常工作(我正在使用Rails 3.0.4,而v3.0.3出现了相同的问题)。看这里。解决方案:明确设置另一个YAML引擎
vicvega,

1
这解决了我的YAML文件无法正确加载锚点引用的问题。
杰里米·麦克

3
这只是快速解决方案,而不是长期解决方案。可能您应修复一些yaml文件中的语法错误。
jonepatr 2011年

11
我遇到了类似的问题,因此通过yamllint.com运行了我的YAML,以查看是否存在问题。尽管报告说YAML有效,但它重新格式化了文件。我用重新格式化的版本替换了原来无法正常工作的YAML,并且可以正常工作。问题解决了。
Charles Roper 2012年

1
对于所有反对者来说,是的,请修复您的YAML,但是此技巧无价,因为如果您使用syck序列化的YAML不好,并且想要将其转换为使用psych序列化的有效YAML,则需要在解析期间使用两个解析器的能力。同样的红宝石执行。
gtd 2012年

49

我的常规Rails 3 App也有此问题,因为我使用的是本地化的Yaml文件作为日期/时间。

正如您在此提交https://github.com/rails/rails/commit/dc94d81中看到的那样, 可以通过将数组放在单独的行中来轻松地“修复”此问题。

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

2
谢谢,一直在寻找确切的问题并解决了该问题,尽管这与上述问题不同:)
Malte

1
我在rubber-postgresql.yml上遇到了麻烦,在编辑器中修复了像这样的引用,它起作用了。其余的橡胶配置看起来还不错。
罗布

20

对Paul Raupach的答案进行了一些细微的调整,当从目录运行时,它将在所有子目录中递归查找所有* .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

18

根本原因已在许多地方进行了描述,我将再次对其进行总结。

默认的yaml解析器Psych有两个,新的,您应该使用的。Syck是老版本,它没有维护和消亡,它当前被用作没有libyaml时的回退(通常是非Linux系统)。

重要的是您在某处有一些无效的Yaml。它很可能在您的翻译文件中(我有未引号的字符串,以%开头)。只需尝试在生产框上使用YAML.load_file加载所有yml文件,您将看到哪一个是损坏的文件。


6
拒绝投票是因为您错了。psych不支持默认块,从技术上讲,它更接近yaml标准,但是会(除其他外)破坏现有和预期的用法。IMO ruby​​应该使用既维护又支持现有用法的解析器,即使该用法离规范更远。如果只有这样的事情。直到有,他们应该使用syck。
萨拉(Sarah Mei)

我也同意莎拉的观点。转移到pysch的整个过程不过是头疼而已,没有明显的价值。我的“无效yaml”不是无效的,只是使用了“ order:[:year,:month,:day]”语法,就我所知(或关心),它一直很好
Rob

显然psych版本1.3可以理解默认值。也许:-)解决方案:在Gemfile中使用“ gem'psych','> = 1.3.2'”。
AlexChaffee 2012年

13

我遇到了这个问题,因为我使用了制表符而不是空格


1
是的,感觉我们应该结束那个!
13年

盯着yml文件搜索丢失的冒号后失明。
daslicious

13

最好修复您的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>'

7

绝对修复您的Yaml代码,不要仅仅通过强迫YAM1使用“ syck”来“掩盖”真正的问题。我遇到了同样的问题,并在本地化文件中发现格式错误的yml语句。如果仅强制使用旧的解析器,那么您将无法从项目中其他地方获得新解析器上所有工作的好处。


1
使用新的解析器无法检测到任何好处,只能以明显正确的YAML(在第1行中没有col 16的文件中看到神秘的错误消息(我目前正在查看“ Error Unknown on line 1,col 16”的文件))与psych先前版本一起解析的文件。无休止的错误修复和回归是日常工作。因此,不要变得崇高而强大,这是无尽的头痛。
罗布2012年

7

原始问题的问题在于RedCloth。我遇到了同样的问题,仅更新到RedCloth gem的最新版本(当前为4.2.7)即可解决此问题。

上面来自Honza和FlyboyArt的建议是正确的,您应该修复任何自定义的YAML,但是随着RedCloth的流行,大多数使用RedCloth的用户在发现此问题时也应确保他们的GemFile添加了以下这一行:

gem 'RedCloth', ">= 4.2.7"

4

对于其他阅读此内容的人,在我的数据库配置中输入错误后出现此错误- /config/database.yml


Typos显然不包括在文件末尾添加换行符!
艾伦·大卫·加西亚

3

这是捆绑程序1.0.10问题:详细信息在这里

尝试只是降低捆绑器的日期


即时通讯使用1.0.10,您的意思是等待新版本?

1
我解决了回到捆扎机1.0.7的问题。我希望此问题将在下一版本中得到解决
vicvega

我使用的是Bundler 1.1.3版,现在仍然可以使用。
Dean Perry

2

解决该问题的原因确实是以下格式的YAML转换文件格式错误:

config/locales/bg.yml

更正了YAML错误,一切都很好。:-)


没有帮助,也许是我在另一个YAML文件中的错误,如何找出错误的YAML文件在哪里?

2

对于那些追求此问题的人,我刚刚发现我的database.yml触发了此错误,因为password:关键字和密码之间没有空格。一个几乎看不见的错误,并且在早期版本的rails上运行的database.yml没有错误。


2

我通过尝试使用密码连接到远程数据库而收到此错误,'p@ssword'并发现psych不喜欢该'@'符号。更改了数据库密码并解决了问题。


2

我有这个问题。我的问题是我的database.yml文件中有一个额外的选项卡。


我忘了密码之间有一个标签:和“我的密码”
EE33

2

我在正在构建的应用程序中使用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"

瞧-讨厌的错误消息消失了。


2

就我而言,这不是Bundle问题:(假设使用Ruby 1.9)

  • 如果存在libyaml,则默认情况下,Ruby使用'psych'(链接到C库的更新和维护的yaml库:libyaml)
  • 否则,Ruby使用“ syck”(旧且未维护)
  • YAML :: ENGINE.yamler ='syck'因此将迫使Ruby在还安装了'psych'的机器上使用'syck'

更多信息在这里:require“ yaml”不使用psych作为默认值


谢谢。我的也是一个红矿问题。
user456584 2012年

2

我设法通过在:development和:test组内安装gem psych来解决此问题。

gem 'psych'


1

尽管@Vicvega给出的答案可能有效或无效(未经测试),但它违反了Rails和Ruby的通用原则“ Convention over configuration”,并且应谨慎对待(甚至在协作工作中更多),甚至尽管这种情况下的“配置”不是很好

所以对于那些建议消除YAML文件中的语法错误的人,我的投票(如果可以的话)。

现在......解决了错误,对我来说是种一个牛逼的错误,我没有,我已经定义为默认的语言环境文件Config/application.rb在我的Config/locales目录

快乐编码


1

需要检查.yml文件是否有错误,我在我的database.yml中发现了问题


1

我对格式错误的YAML转换文件有类似的问题。它在定义变量之前使用了变量。以下是错误的:

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

它必须更改为:

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

然后它又开始工作了。


1

就我而言,有2个问题。

  1. 正如@stwienert所提到的,数组表示形式是一个问题。
  2. 还有一件事,如果一个字符串以%{var}开头,我将收到一个Parse异常。我必须相应地更改字符串,以避免以%{var}开头

例如,如果字符串是

%{user_name} welcome to %{application_name} -这引发了一个错误

要修复它,我必须将其更改为

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

希望这对某人有帮助。

问候,

Shardul。


您可以简单地更改YAML文件以在字符串两边加上引号,这样hello: %{user_name} welcome to %{application_name}就变得hello: "%{user_name} welcome to %{application_name}"不必更改句子,而句子就是马车。
戴夫·萨格2012年

1

好吧,以防万一这有帮助...
我做了什么:
-选择所有内容,然后从https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml复制到新的es中。带有Notepad ++的
yml-试图使用netBeans IDE文本编辑器观看此新文件,我收到有关utf8安全加载的警告(无法调用确切的文本)。因此,没有使用此文本编辑器打开它。
-切换到本地通过configuration / application.rb i18n-
加载irb页面时,出现“无法解析第0行第0列0处的YAML”,是指Psych。
-进入IRB,并用syck加载了文件,没关系;切换到心理,并得到相同的错误。

我如何解决它:
-返回从https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml复制内容,但是这次我将其粘贴到一个新创建的文件中netBeans编辑器。
-重新启动了webRick。
- 问题解决了。
最好的问候,
维克多


1

从中删除未使用的数据库database.rb。如果使用MySQL而没有PostgreSQL,则从中删除PG数据库代码databases.yml


1

Pshych解析很烂。我不确定这是否是一种优雅的解决方案,但我设法通过卸载来解决此问题。

gem uninstall psych

这给了我以下错误:gem "psych" cannot be uninstalled because it is a default gem
Paul Verschoor

1

我遇到了一个非常非常奇怪的问题,因为之后还有空格。例如:

title: "NASA"

没用,但是

title:"NASA"

做到了


1

如果您像我一样,面对一个拥有数百个灯具的项目(继承),那么几行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根目录并运行,完成后将其丢弃。


0

对于其他查看此问题的人,我发现了Rails应用程序中rerun.txt正在调用的问题config/cucumber.ymlrerun.txt配置为存储最近的黄瓜未通过测试,我在控制台中以某种方式输入了奇怪的字符来进行黄瓜测试。

那很难找到。希望不久前我能看到Glenn Rempe的回答


0

可能的原因之一是在此上下文中第...行处不允许映射值。

这是一个错误的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

小心!它不适用于åøæ等特殊字符。

让我知道是否对您有用:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.