rails错误,无法解析YAML

时间:2011-02-12 21:57:51

标签: ruby-on-rails-3 yaml redcloth

更新宝石后我得到了这个:

/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 rails 3.0.3

试图重新安装gem RedCloth,没有帮助,系统只想使用4.2.3版本

知道怎么解决吗?感谢

29 个答案:

答案 0 :(得分:166)

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

如果你不能(或不想)修复你的YAML代码,请尝试加载旧的YAML解析器(syck),在config/boot.rb

的开头添加它
require 'yaml'
YAML::ENGINE.yamler = 'syck'

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

答案 1 :(得分:49)

我的常规Rails 3应用程序也遇到了这个问题,因为我在日期/时间使用了本地化的yaml文件。

正如您在此提交中所看到的https://github.com/rails/rails/commit/dc94d81 通过将数组放在单独的行中,可以很容易地“修复”。

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

答案 2 :(得分: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

答案 3 :(得分:17)

许多地方都描述了根本原因,我将再次总结一下。

有两个默认的yaml解析器Psych是新的,你应该使用的那个。 Syck是旧的,它没有维护和死亡,它目前用作没有libyaml存在时的后退(通常是非Linux系统)。

重要的是你在某个地方有一些无效的yaml 。它很可能是在你的翻译文件中(我有不带引号的字符串,用%表示)。只需尝试在生产盒上加载YAML.load_file的所有yml文件,你就会看到哪一个是坏的。

答案 4 :(得分:13)

我遇到了这个问题,因为我使用的是标签而不是空格

答案 5 :(得分: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>'

答案 6 :(得分:6)

绝对修复你的yaml代码,不要强迫YAMl使用'syck'来掩盖真正的问题。我有同样的问题,在我的本地化文件中发现格式错误的yml语句。如果您只是强制使用较旧的解析器,那么您将无法从项目中其他位置的新解析器中获得所有工作的好处。

答案 7 :(得分:6)

原始问题的问题出在RedCloth中。我遇到了同样的问题,只是更新到最新版本的RedCloth gem(目前4.2.7)修复了这个问题。

以上来自Honza和FlyboyArt的建议是合理的,您应该修复任何自定义的YAML,但是RedCloth很受欢迎,大多数用户发现这个问题也使用RedCloth应该确保他们的GemFile添加了这一行:

gem 'RedCloth', ">= 4.2.7"

答案 8 :(得分:4)

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

答案 9 :(得分:3)

这是一个捆绑包1.0.10问题:details here

尝试降级捆绑器

答案 10 :(得分:2)

在我的事业中修正了它的确是格式错误的YAML翻译文件:

config/locales/bg.yml

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

答案 11 :(得分:2)

我设法通过在组内部安装gem psych来解决这个问题:开发和:测试。

gem 'psych'

答案 12 :(得分:2)

当我在我正在构建的Sinatra应用中使用r18n library时,我遇到了这个问题,在我的翻译文件中,我有以下内容:

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"

并且吵闹 - 错误的错误消息消失了。

答案 13 :(得分:2)

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

答案 14 :(得分:2)

对于那些追求这个问题的人,我刚刚发现我的database.yml触发了这个错误,因为它在password:keyword和密码之间没有空格。一个几乎不可见的错误,以及在早期版本的rails上没有错误的database.yml。

答案 15 :(得分:2)

对于我的情况,它不是Bundle问题:(假设Ruby 1.9)

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

此处有更多信息:require "yaml" doesn't use psych as default

答案 16 :(得分:1)

我遇到了与格式错误的YAML翻译文件类似的问题。它在定义变量之前使用了变量。以下是错误的:

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

必须改为:

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

然后它再次开始工作。

答案 17 :(得分:1)

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

答案 18 :(得分: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根目录并运行它,在完成后将其删除。

答案 19 :(得分:1)

需要检查.yml文件是否有错误,我在database.yml

中发现了问题

答案 20 :(得分:1)

就我而言,有两个问题。

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

    例如,如果字符串是

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

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

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

    希望这有助于某人。

    此致

    Shardul。

答案 21 :(得分:1)

虽然@Vicvega给出的答案可能会或可能不会起作用(没有测试),但这违反了Rails和Ruby的共同原则“约定优于配置”,应该小心对待(和甚至在协作工作中更多),即使这种情况下的“配置”不是很好

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

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

快乐编码

答案 22 :(得分:1)

嗯,以防这有助于...
我做了什么:
- 选择全部并从https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml复制到带有记事本++的新es.yml中 - 尝试用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。
- 问题解决了。
最诚挚的问候,
维克多

答案 23 :(得分:1)

我和ruby 1.9.2-p180有同样的问题,转到1.9.2-p290为我解决了这个问题

答案 24 :(得分:1)

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

答案 25 :(得分:1)

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

gem uninstall psych

答案 26 :(得分:1)

我有一个非常非常奇怪的问题因为我之后有空格。 E.g:

title: "NASA"

没有用,但是

title:"NASA"

依然如故

答案 27 :(得分:0)

对于其他人来说,我发现rerun.txt中的问题是由config/cucumber.yml在Rails应用中调用的。 rerun.txt被配置为存储最近的黄瓜失败测试,​​并且我在控制台中以某种方式输入了奇怪的角色进行黄瓜测试。

很难找到。希望我曾经见过Glenn Rempe's answer

答案 28 :(得分: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

小心!对于像åøæ等特殊字符,它无法正常工作。

请在评论中告诉我它是否适合你:)