rails的错误,无法parsingYAML

更新gem后,我有这个:

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

试过重新安装gemRedCloth,没有帮助,系统只想使用4.2.3版本

任何想法如何解决它? 谢谢

您的某处有无效的YAML代码。 我的意思是无效的心(新的rubyYAML分析器)。

如果你不能(或者不想)修正你的YAML代码,试着加载旧的YAMLparsing器(syck),在config/boot.rb的开头添加这个

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

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

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

正如你可以看到在这个提交https://github.com/rails/rails/commit/dc94d81这可以很容易地“固定”通过将数组放在单独的行。;

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

对Paul Raupach的答案略作调整,当从一个目录运行时,所有子目录都会recursion地查找所有* .yml文件并testing该文件。 我从我的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 

根源在很多地方都有描述,我会再次总结一下。

有两个默认的yamlparsing器Psych是新的,你应该使用的。 Syck是旧的,它没有维护和死亡,目前用于当没有libyaml礼物(通常是非linux系统)的时候。

重要的是你有一些无效的yaml 。 这是最有可能在你的翻译文件(我有没有引用的string%)。 只要尝试加载所有的YAML文件在生产框中的YAML.load_file,你会看到哪一个是坏的。

我有这个问题,因为我用了一个选项卡,而不是空格

最好修复你的YAML文件

这里是如何使用irb,所以你不需要轨道控制台可能不工作:

 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'来“掩盖”真正的问题。 我有这个相同的问题,在我的本地化文件中发现格式不正确的XML语句。 如果您只是强制使用较旧的parsing器,那么您将无法从项目中其他位置的新parsing器获得所有工作的好处。

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

Honza和FlyboyArt的上述build议是合理的,您应该修复您拥有的任何自定义YAML,但是RedCloth的受欢迎程度如此之高,大多数用户在使用RedCloth时发现此问题也应该确保他们的GemFile添加了此行:

 gem 'RedCloth', ">= 4.2.7" 

对于读这个的人来说,在我的数据库configuration中input错误之后,我得到了这个错误 – /config/database.yml

这是一个捆绑1.0.10问题: 细节在这里

尝试只是downdate打包机

什么修复了我的原因确实格式错误的YAML翻译文件在:

 config/locales/bg.yml 

更正了YAML的错误,一切正常。 🙂

对于那些追求这个问题,我刚刚发现我的database.yml正在触发这个错误,因为它之间的密码:关键字和密码之间没有空格。 一个几乎看不见的错误,并与一个早期版本的rails工作没有错误的database.yml。

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

我遇到了这个,因为我正在使用我正在创build的Sinatra应用程序中的r18n库 ,在我的翻译文件中,我有以下几点:

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

Ruby 1.8.7下的旧项目中工作得很好,但在Ruby 1.9.3下失败了。

@SB的回答给了我解决问题的线索。 较新的YAML在%1处不起作用。 一些快速挖掘和irb的实验,我现在知道,新版本的YAMLparsing器需要你引用以%1开头的string,所以我只是改变了我的翻译

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

瞧 – 糟糕的错误信息消失了。

对于我的情况,这不是一个捆绑问题:(假设Ruby 1.9)

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

更多的信息在这里: 要求“yaml”不使用心灵默认

我设法解决这个问题,通过安装gem心灵组内:发展和:testing。

 gem 'psych' 

我有与ruby1.9.2-P180相同的问题,去1.9.2-P290解决了这个问题

尽pipe@Vicvega给出的答案可能会也可能不会(不testing它),它违背了Rails和Ruby共同的原则“公约重于configuration” ,应该小心处理(甚至在协作工作中),甚至虽然在这种情况下的“configuration”并不好

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

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

快乐的编码

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

我有一个与格式不正确的YAML翻译文件类似的问题。 它在定义它之前使用了一个variables。 以下是错误的:

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

它必须改为:

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

然后它又开始工作了。

我得到这个错误,试图连接到一个远程数据库与密码'p@ssword'并认为心理不喜欢'@'符号。 更改了数据库密码并解决了问题。

在我的情况有两个问题。

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

例如,如果string是

%{user_name} welcome to %{application_name} – 这会引发错误

要解决它,我不得不改变它

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

希望这有助于某人。

问候,

Shardul。

那么,以防万一这有助于…
我做了什么:
– select全部并从https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml复制到一个新的es.yml与记事本++
– 试图用netBeans IDE文本编辑器观看这个新文件,我用utf8得到了关于安全加载的警告(无法回想确切的文字)。 所以没有用这个文本编辑器打开它。
– 切换本地通过configuration/ application.rb i18n
– 当我加载一个irb页面时,我得到了“无法parsingYAML在0行0列”指的是Psych。
– 去IRB和加载文件与syck它是好的; 切换到心理,并得到同样的错误。

我如何解决它:
– 回去复制从https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml的内容,但这次我用netBeans编辑器将它粘贴到一个新创build的文件中。;
– 重新启动webRick。
– 问题解决了。
最好的祝福,
胜利者

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

Pshychparsing是吸引核心。 我不知道这是否是优雅的解决scheme,但我设法解决这个问题,通过卸载它。

 gem uninstall psych 

我有一个非常奇怪的问题,因为我之后有空位。 例如:

 title: "NASA" 

没有工作,但

 title:"NASA" 

没有。

如果你像我一样面对一个项目(inheritance)数百个灯具,几行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发现了这个问题,这个问题在Rails应用中被config/cucumber.yml调用。 rerun.txtconfiguration为存储最近的黄瓜失败testing,​​我不知何故进入奇怪的angular色黄瓜testing在控制台。

那很难find。 希望我已经看到了Glenn Rempe的回答 。

其中一个可能的原因是映射值不允许在这种情况下行… … –

这是一个不正确的YAML示例(用户:实际上不应该包含任何值,因为它包含子项some_key和some_other_key)

 customer: Customer user: User some_key: value some_other_key: value 2 

find这样的问题并不是一件容易的事情,特别是如果你有一个巨大的YAML文件。

我创build了一个非常简单的正则expression式来检测这样的事情。 我在RubyMine中检查过它

 ^(\s+)['"\w]+:\s?['"\w]+.*\n\1\s\s 

小心! 它不适用于特殊的字符,如øøæ等

让我知道在评论中,如果它为你工作:)

Interesting Posts