rails error, couldn't parse YAML

南楼画角 提交于 2019-11-26 01:57:04

问题


After updating the gems I\'ve got this:

/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

Tried to reinstall gem RedCloth, didn\'t help, system wants to use only 4.2.3 version

Any idea how to fix it? Thanks


回答1:


You have invalid YAML code somewhere. I mean invalid for Psych (the new ruby YAML parser).

If you cannot (or don't want to) fix your YAML code, try to load the old YAML parser (syck), adding this at the beginning of config/boot.rb

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

It's just a 'quick and dirty' fix, I know




回答2:


My regular Rails 3 App also had this problem, because I was using a localized yaml File for Date/Times.

As you can see in this commit https://github.com/rails/rails/commit/dc94d81 this can be easy "fixed" by placing the array in seperate lines.

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



回答3:


A slight tweak on Paul Raupach's answer which, when run from a directory, finds all *.yml files recursively in all sub-directories and tests the file. I ran it from my Rails root dir.

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



回答4:


The root cause was described on many places and I will summarize it again.

There are two default yaml parser Psych is the new one, the one you should be using. Syck is the old one, its not maintained and dying, its currently used as fall back for when there is no libyaml present (non-linux systems usually).

The important thing is you have some invalid yaml somewhere. It is most probably in your translation files (I had unquoted strings strating with %). Just try loading all your yml files with YAML.load_file on the production box and you will see which one is the broken one.




回答5:


I had this problem because i had used a tab instead of spaces




回答6:


It's best to fix your YAML files

Here is how using irb so you don't need the rails console which is probably not working:

require 'yaml'
YAML::ENGINE.yamler = 'psych'
YAML.load_file('config/locales/xxx.en.yml')

you'll get a nice output telling you where the issue is:

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:


Absolutely fix your yaml code don't just 'mask' the real problem by forcing YAMl to use 'syck'. I had this same problem and found malformed yml statements in my localization files. If you just force using the older parser then you will not get the benefits of all the work on the new parser elsewhere in your project.




回答8:


The problem with the original question was in RedCloth. I was experiencing the same issue and simply updating to the most recent version of the RedCloth gem (Currently 4.2.7) fixed the issue.

The above advice from Honza and FlyboyArt is sound and you should fix any custom YAML you have, but with RedCloth being as popular as it is, most users finding this question who also use RedCloth should make sure their GemFile has this line added:

gem 'RedCloth', ">= 4.2.7"



回答9:


For others reading this, I got this error after making a typo in my database configuration - /config/database.yml




回答10:


It's a bundler 1.0.10 issue: details here

Try just to downdate bundler




回答11:


What fixed it in my cause was indeed malformed YAML translation file in:

config/locales/bg.yml

Corrected the YAML mistake and it was all fine. :-)




回答12:


For those pursuing this issue I have just found that my database.yml was triggering this error because it had no space between the password: keyword and the password. An almost invisible error, and with a database.yml that had worked without errors on an earlier version of rails.




回答13:


I had this problem. My problem was I had an extra tab in my database.yml file.




回答14:


I came across this as I was using the r18n library in a Sinatra app I'm building, and in my translation file I had the following:

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

which used to work just fine in an older project under Ruby 1.8.7, but which was failing under Ruby 1.9.3.

An answer by @SB gave me the clue I needed to work out my problem. The newer YAML was balking at the %1. Some quick digging and an experiment with irb and I now know that the newer version of the YAML parser requires you to put quotes around strings that start with %1, so I just changed my translation to be

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

and voila - nasty error message vanished.




回答15:


For my case, it is not a Bundle issue: (Ruby 1.9 is assumed)

  • Ruby, by default, uses 'psych' (newer and maintained yaml library linking to the C library: libyaml) if libyaml is present
  • Otherwise, Ruby uses 'syck' (old and not maintained)
  • YAML::ENGINE.yamler= 'syck' will thus forces Ruby to use 'syck' on a machine where 'psych' is also installed

More info here: require "yaml" doesn't use psych as default




回答16:


I manage to fix this problem by installing gem psych inside group :development and :test.

gem 'psych'



回答17:


I had the same issue with ruby 1.9.2-p180 , going to 1.9.2-p290 solved this for me




回答18:


Though the answer given by @Vicvega may or may not work (Didn't test it) it goes against Rails and Ruby common principle "Convention over configuration" and should be treated with care (and even more in collaborative work),,, even though the "configuration" in this case is not great

so my vote goes (If i could vote) for those who proposed to eliminate the syntax errors in the YAML files.

now... to solve the error, for me it was kind of a newby error, I didn't have the locale file which I had defined to be the default in Config/application.rb in my Config/locales directory

happy coding




回答19:


Need to check .yml files for error, I have found problem in my database.yml




回答20:


I had a similar issue with a malformed YAML translation file. It used a variable before defining it. The following was wrong:

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

It had to be changed to:

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

Then it started working again.




回答21:


I got this error from trying to connect to a remote db with the password 'p@ssword' and figured out that psych doesn't like the '@' symbol. Changed the DB password and problem solved.




回答22:


In my case there were 2 issues.

  1. As mentioned by @stwienert, the array representation was an issue.
  2. One more thing was, if a String started with a %{var} I received a Parse exception. I had to change the strings accordingly to avoid beginning with %{var}

For example if the string was

%{user_name} welcome to %{application_name} -- This threw an error

To fix it I had to change it to

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

Hope this helps someone.

Regards,

Shardul.




回答23:


Well, just in case this helps...
What I did:
- select all and copy from https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml into a new es.yml with notepad++
- tried to watch this new file with netBeans IDE text editor, I got a warning about safe load with utf8 (cannot recall the exact text). Hence did not open it with this text editor.
- switched the local thru configuration/application.rb i18n
- when I loaded a irb page I got "couldn't parse YAML at line 0 column 0" referring to Psych.
- Went to IRB and loaded the file with syck it was ok; switched to psych and got same error.

How I solved it:
- went back to copy the contents from https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml but this time I pasted it in a newly created file with netBeans editor.
- restarted webRick.
- problem solved.
Best Regards,
Victor




回答24:


Remove unused databases from database.rb. If you use MySQL and there is no PostgreSQL then delete PG database code from databases.yml.




回答25:


Pshych parse is suck to the core. I am not sure if this is elegant solution but i manage to fix this problem by uninstalling it.

gem uninstall psych



回答26:


I had a really, really strange problem because I had spaces after. E.g.:

title: "NASA"

Did not work, but

title:"NASA"

Did.




回答27:


If you're like me and facing a project (inherited) with hundreds of fixtures a few lines of Ruby can save you hours:

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

Just put it in your Rails root and run it, trash it when you're done.




回答28:


For other people looking at this I found the issue in rerun.txt which was being called by config/cucumber.yml in a Rails app. rerun.txt was configured to store the most recent cucumber failing test and I had somehow entered weird characters for a cucumber test in the console.

That was hard to find. Wish I had seen Glenn Rempe's answer a while back.




回答29:


One of the possible causes is mapping values are not allowed in this context at line ...

Here is an incorrect YAML example (user: should not contain any value actually, because it contains children items some_key and some_other_key)

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

It's not a trivial task to find such issue especially if you have a huge YAML file.

I've created a pretty simple regexp to detect such things. I checked it in RubyMine

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

Be careful! It doesn't work correct with special chars like å ø æ etc.

Let me know in comments if it worked for you :)



来源:https://stackoverflow.com/questions/4980877/rails-error-couldnt-parse-yaml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!