【问题标题】:rails error, couldn't parse YAMLrails 错误,无法解析 YAML
【发布时间】:2011-06-26 05:41:21
【问题描述】:

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

/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 文件中。
  • 我不使用任何 YAML 文件,所以我认为这是其他人的问题。
  • 您正在运行哪个命令?你在使用 RVM 吗?
  • 它发生在命令 rails console 和 rails server 之后。是的,我正在使用 rvm

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


【解决方案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 根目录中并运行它,完成后将其丢弃。

【讨论】:

    【解决方案2】:

    对 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】:

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

      这是一个不正确的 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
      

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

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

      【讨论】:

        【解决方案4】:

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

        这很难找到。希望我不久前看到Glenn Rempe's answer

        【讨论】:

          【解决方案5】:

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

          gem 'psych'
          

          【讨论】:

            【解决方案6】:

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

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

            更多信息在这里:require "yaml" doesn't use psych as default

            【讨论】:

            • 谢谢。我的也是 redmine 问题。
            【解决方案7】:

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

            title: "NASA"
            

            没用,但是

            title:"NASA"
            

            做过。

            【讨论】:

              【解决方案8】:

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

              gem uninstall psych
              

              【讨论】:

              • 这给了我以下错误:gem "psych" cannot be uninstalled because it is a default gem
              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                我在我正在构建的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"
                

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

                【讨论】:

                  【解决方案11】:

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

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

                  【讨论】:

                    【解决方案12】:

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

                    【讨论】:

                    • 我忘记在密码:和“我的密码”之间添加标签
                    【解决方案13】:

                    就我而言,有 2 个问题。

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

                    例如,如果字符串是

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

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

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

                    希望这对某人有所帮助。

                    问候,

                    沙杜尔。

                    【讨论】:

                    • 您可以简单地更改YAML 文件以在字符串周围加上引号,因此hello: %{user_name} welcome to %{application_name} 变为hello: "%{user_name} welcome to %{application_name}" 而不必更改您的句子,即马车领先。
                    【解决方案14】:

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

                    【讨论】:

                      【解决方案15】:

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

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

                      必须改成:

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

                      然后它又开始工作了。

                      【讨论】:

                        【解决方案16】:

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

                        【讨论】:

                        • 错字包括不在文件末尾添加换行符,显然......!
                        【解决方案17】:

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

                        【讨论】:

                          【解决方案18】:

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

                          【讨论】:

                            【解决方案19】:

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

                            【讨论】:

                            • 是的,感觉我们应该结束了!
                            • 在盯着 yml 文件搜索丢失的冒号后失明。
                            【解决方案20】:

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

                            【讨论】:

                              【解决方案21】:

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

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

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

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

                              【讨论】:

                              • Bundler 1.0.10 默认将 Psych 作为 YAML 引擎加载。 Psych 不适用于 rails(我使用的是 rails 3.0.4,而 v3.0.3 也有同样的问题)。见here。解决方案:显式设置另一个 YAML 引擎
                              • 这解决了我的 YAML 文件没有正确加载锚引用的问题。
                              • 这只是一个快速的解决方案,而不是一个长期的解决方案。可能您的某些 yaml 文件中存在语法错误,您应该修复这些错误。
                              • 我遇到了类似的问题,因此通过yamllint.com 运行我的 YAML 以查看是否有问题。尽管它报告 YAML 是有效的,但它重新格式化了文件。我用这个重新格式化的版本替换了旧的非工作 YAML,它工作了。问题解决了。
                              • 对于所有的反对者来说,是的,修复你的 YAML,但是这个提示是无价的,因为如果你有坏的 YAML 用 syck 序列化,并且你想将它转换为有效的YAML 用 psych 序列化,您需要能够在同一个 ruby​​ 执行期间使用这两个解析器。
                              【解决方案22】:

                              虽然@Vicvega 给出的答案可能有效,也可能无效(没有测试过),但它违反了 Rails 和 Ruby 的共同原则 “约定优于配置”,应该谨慎对待(并且在协作工作中更多),,,即使这种情况下的“配置”不是很好

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

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

                              快乐编码

                              【讨论】:

                                【解决方案23】:

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

                                【讨论】:

                                  【解决方案24】:

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

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

                                  gem 'RedCloth', ">= 4.2.7"
                                  

                                  【讨论】:

                                    【解决方案25】:

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

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

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

                                    【讨论】:

                                    • 投反对票,因为你错了。 psych 不支持默认块,这在技术上更接近 yaml 标准,但打破了(除其他外)rails 的现有和预期使用。 IMO ruby​​ 应该使用既维护又支持现有用法的解析器,即使该用法与规范相差甚远。要是有这样的事就好了。在此之前,他们应该使用 syck。
                                    • 我也同意莎拉的观点。对 pysch 的整个迁移只是令人头疼,没有明显的价值。我的“无效 yaml”并非无效,它只是使用“订单:[:年,:月,:日]”语法,据我所知(或关心),这一直很好
                                    • 显然 1.3 版的 psych 理解默认值。也许 :-) 解决方案:在 Gemfile 中使用“gem 'psych', '>=1.3.2'”。
                                    【解决方案26】:

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

                                    【讨论】:

                                    • 我无法使用新的解析器检测到任何好处,只有神秘的错误消息(我目前正在查看没有第 16 列的文件的“第 1 行上的错误未知,第 16 列”在第 1 行中)在用先前版本的 psych 解析的明显正确的 YAML 文件中。无休止的错误修复和回归是一天的顺序。所以不要自高自大,这是一个无休止的头痛。
                                    【解决方案27】:

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

                                    尝试仅更新捆绑程序

                                    【讨论】:

                                    • 我用的是1.0.10,你的意思是等待新版本?
                                    • 我解决了回到 bundler 1.0.7 的问题。希望下个版本能解决这个问题
                                    • 我正在使用 Bundler 1.1.3 版,它仍然可以使用。
                                    【解决方案28】:

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

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

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

                                    【讨论】:

                                    • 谢谢,正在寻找这个问题并解决了它,尽管这与上面问题的问题不同:)
                                    • 我在使用 Rubber-postgresql.yml 时遇到了问题,通过编辑器修复了这样的引用,它成功了。其余的橡胶配置似乎很好。
                                    【解决方案29】:

                                    在我的原因中修复它的确实是格式错误的 YAML 翻译文件:

                                    config/locales/bg.yml
                                    

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

                                    【讨论】:

                                    • 没有帮助,可能是我在另一个 YAML 文件中的错误,如何找出错误的 YAML 文件在哪里?
                                    猜你喜欢
                                    • 2011-08-16
                                    • 2014-06-02
                                    • 1970-01-01
                                    • 2018-06-23
                                    • 2018-10-05
                                    • 2019-01-20
                                    • 2016-10-26
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多