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

知道如何解决吗?谢谢

4

29 回答 29

165

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

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

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

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

于 2011-02-24T15:59:51.890 回答
49

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

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

         -    order: [ :year, :month, :day ]
    18  +    order:
    19  +      - :year
    20  +      - :month
    21  +      - :day
于 2011-03-16T09:11:08.373 回答
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
于 2012-03-24T00:59:47.003 回答
18

根本原因在很多地方都有描述,我再总结一下。

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

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

于 2011-06-02T17:59:15.557 回答
13

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

于 2011-11-12T17:43:34.257 回答
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>'
于 2012-01-26T18:09:55.213 回答
7

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

于 2011-05-29T06:28:47.393 回答
7

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

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

gem 'RedCloth', ">= 4.2.7"
于 2011-06-03T14:40:14.333 回答
4

对于其他阅读本文的人,在我的数据库配置中输入错误后,我得到了这个错误 -/config/database.yml

于 2012-01-28T23:45:49.960 回答
3

这是一个 bundler 1.0.10 问题:这里有详细信息

尝试仅更新捆绑器

于 2011-02-14T14:58:33.673 回答
2

在我的事业中解决它的确实是格式错误的 YAML 翻译文件:

config/locales/bg.yml

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

于 2011-02-23T14:44:41.657 回答
2

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

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

更多信息:require "yaml" 不使用 psych 作为默认值

于 2011-05-03T07:46:25.860 回答
2

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

于 2011-11-30T07:08:40.433 回答
2

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

于 2012-03-09T06:54:34.950 回答
2

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

于 2012-05-14T16:43:39.043 回答
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"

瞧——讨厌的错误信息消失了。

于 2012-09-19T00:40:49.073 回答
2

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

gem 'psych'
于 2013-06-26T07:50:33.030 回答
1

我对 ruby​​ 1.9.2-p180 有同样的问题,去 1.9.2-p290 为我解决了这个问题

于 2011-09-21T14:53:33.423 回答
1

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

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

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

快乐编码

于 2011-10-13T17:03:13.967 回答
1

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

于 2011-11-08T05:42:22.247 回答
1

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

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

它必须改为:

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

然后它又开始工作了。

于 2012-03-08T11:05:04.893 回答
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 根目录中并运行它,完成后将其丢弃。

于 2012-03-22T21:16:05.183 回答
1

就我而言,有两个问题。

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

例如,如果字符串是

%{user_name} welcome to %{application_name}-- 这抛出了一个错误

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

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

希望这可以帮助某人。

问候,

沙杜尔。

于 2012-04-14T15:57:31.057 回答
1

好吧,以防万一这有帮助......
我做了什么: - 全选并从https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml
复制到一个新的 es 中。 yml with notepad++ - 尝试使用 netBeans IDE 文本编辑器观看这个新文件,我收到了关于使用 utf8 安全加载的警告(无法回忆确切的文本)。因此没有用这个文本编辑器打开它。 - 通过配置/application.rb i18n 切换本地 - 当我加载一个 irb 页面时,我得到“无法在第 0 行第 0 列解析 YAML”,指的是 Psych。- 去 IRB 并用 syck 加载文件没问题;切换到心理并得到同样的错误。



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

于 2012-07-29T21:37:11.927 回答
1

database.rb. 如果您使用 MySQL 并且没有 PostgreSQL,则从databases.yml.

于 2012-09-28T09:56:14.630 回答
1

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

gem uninstall psych
于 2012-11-16T08:26:17.797 回答
1

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

title: "NASA"

没用,但是

title:"NASA"

做过。

于 2013-02-26T03:45:31.100 回答
0

对于其他看到这个的人,我发现了在 Rails 应用程序rerun.txt中被调用的问题。配置为存储最近的黄瓜失败测试,​​我不知何故在控制台中输入了奇怪的字符用于黄瓜测试。config/cucumber.ymlrerun.txt

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

于 2013-11-05T20:18:56.070 回答
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

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

如果它对你有用,请在评论中告诉我:)

于 2014-02-20T15:36:50.190 回答