web-dev-qa-db-fra.com

rails erreur, impossible d'analyser YAML

Après avoir mis à jour les gemmes, j'ai ceci:

/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

Je ai essayé de réinstaller gem RedCloth, n'a pas aidé, le système veut utiliser uniquement la version 4.2.3

Toute idée de comment résoudre ce problème? Merci

76
megas

Vous avez un code YAML non valide quelque part. Je veux dire invalide pour Psych (le nouveau Ruby YAML).

Si vous ne pouvez pas (ou ne voulez pas) réparer votre code YAML, essayez de charger l'ancien analyseur YAML (syck), en l'ajoutant au début de config/boot.rb

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

C'est juste une solution "rapide et sale", je sais

166
vicvega

Mon application régulière Rails 3 App avait également ce problème, car j’utilisais un fichier yaml localisé pour la date et l’heure.

Comme vous pouvez le voir dans ce commit https://github.com/Rails/rails/commit/dc94d81 cela peut être facilement "corrigé" en plaçant le tableau dans des lignes séparées.

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

Un léger tweak sur la réponse de Paul Raupach qui, lorsqu'il est exécuté à partir d'un répertoire, trouve tous les fichiers * .yml de manière récursive dans tous les sous-répertoires et teste le fichier. Je l’ai exécuté à partir de mon Rails répertoire racine.

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
20
Glenn Rempe

La cause fondamentale a été décrite à de nombreux endroits et je vais la résumer à nouveau.

L'analyseur yaml par défaut Psych est le nouveau, celui que vous devriez utiliser. Syck est l’ancien, il n’est ni maintenu ni en train de mourir, il est actuellement utilisé comme solution de secours en l’absence de libyaml (systèmes non linux en général).

La chose importante est vous avez un yaml invalide quelque part. C’est très probablement dans vos fichiers de traduction (j’avais des chaînes sans guillemets commençant par%). Essayez simplement de charger tous vos fichiers yml avec YAML.load_file sur la boîte de production et vous verrez lequel est le fichier brisé.

17
Honza

J'ai eu ce problème parce que j'avais utilisé un onglet au lieu d'espaces

13
flunder

Il est préférable de réparer vos fichiers YAML

Voici comment utiliser irb afin que vous n'ayez pas besoin de la console Rails qui ne fonctionne probablement pas:

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

vous obtiendrez une sortie Nice vous indiquant où est le problème:

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>'
13

Absolument réparer votre code yaml ne "masquons" pas le vrai problème en forçant YAMl à utiliser "syck". J'ai eu ce même problème et j'ai trouvé des instructions yml malformées dans mes fichiers de localisation. Si vous forcez simplement l’utilisation de l’ancien analyseur, vous n’obtiendrez pas les avantages de tout le travail effectué sur le nouvel analyseur ailleurs dans votre projet.

6
FlyboyArt

Le problème avec la question initiale était dans RedCloth. Je rencontrais le même problème et la mise à jour vers la version la plus récente de la gem RedCloth (actuellement la version 4.2.7) corrigeait le problème.

Les conseils ci-dessus de Honza et FlyboyArt sont judicieux et vous devriez corriger tout YAML personnalisé que vous avez, mais RedCloth étant aussi populaire, la plupart des utilisateurs trouvant cette question qui utilisent également RedCloth doivent s'assurer que leur fichier GemFile est complété par cette ligne:

gem 'RedCloth', ">= 4.2.7"
6
tiddy

Pour les autres lecteurs, j’ai eu cette erreur après avoir fait une faute de frappe dans la configuration de ma base de données - /config/database.yml

4
David

Il s’agit d’un problème lié au bundle 1.0.10: détails ici

Essayez juste de downdate bundler

3
vicvega

Pour ceux qui poursuivent ce problème, je viens de constater que mon database.yml a déclenché cette erreur car il n'y avait pas d'espace entre le mot de passe: mot-clé et le mot de passe. Une erreur presque invisible, et avec un fichier database.yml ayant fonctionné sans erreur sur une version antérieure de Rails.

2
Anita Graham

Ce qui a résolu ce problème à ma cause, c’est bien le fichier de traduction YAML malformé dans:

config/locales/bg.yml

Correction de l'erreur YAML et tout allait bien. :-)

2
dimitarvp

Pour mon cas, ce n'est pas un problème de Bundle: (Ruby 1.9 est supposé)

  • Ruby, par défaut, utilise 'psych' (bibliothèque yaml conservée et nouvelle reliée à la bibliothèque C: libyaml) si libyaml est présent.
  • Sinon, Ruby utilise 'syck' (ancien et non maintenu)
  • YAML :: ENGINE.yamler = 'syck' va donc forcer Ruby d'utiliser 'syck' sur une machine sur laquelle 'psych' est également installé

Plus d'infos ici: nécessite "yaml" n'utilise pas psych par défaut

2
gamov

Je suis tombé sur cela alors que j'utilisais la bibliothèque r18n dans une application Sinatra que je construis, et dans mon fichier de traduction, j'avais les éléments suivants:

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

qui fonctionnait très bien dans un projet plus ancien sous Ruby 1.8.7, mais qui échouait sous Ruby 1.9.3.

Une réponse de @SB m'a donné l'indice dont j'avais besoin pour résoudre mon problème. Le plus récent YAML hésitait au %1. Quelques fouilles rapides et une expérience avec irb et je sais maintenant que la version plus récente de l’analyseur YAML nécessite de placer des guillemets autour des chaînes qui commencent par %1, alors je viens de changer ma traduction pour être

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

et voila - le message d'erreur méchant a disparu.

2
Dave Sag

Je parviens à résoudre ce problème en installant gem psych inside dans le groupe: développement et: test.

gem 'psych'
2
Thaha kp

J'ai eu ce problème. Mon problème était que j'avais un onglet supplémentaire dans mon fichier database.yml.

2
Tim

Si vous êtes comme moi et que vous faites face à un projet (hérité) avec des centaines de projecteurs, quelques lignes de Ruby peuvent vous faire économiser des heures:

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

Il suffit de le mettre dans votre Rails root et lancez-le, mettez-le dans la corbeille lorsque vous avez terminé.

1
Paul Raupach

Dans mon cas, il y avait 2 problèmes.

  1. Comme mentionné par @stwienert, la représentation sous forme de tableau était un problème.
  2. Une dernière chose à dire, si une chaîne commençait par un% {var}, je recevais une exception Parse. J'ai dû changer les chaînes en conséquence pour éviter de commencer par% {var}

Par exemple, si la chaîne était

%{user_name} welcome to %{application_name} - Cela a jeté une erreur

Pour résoudre ce problème, je devais le changer en

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

J'espère que ça aide quelqu'un.

Cordialement,

Shardul.

1
SB.

J'ai eu un problème similaire avec un fichier de traduction YAML malformé. Il a utilisé une variable avant de la définir. Le suivant était faux:

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

Il fallait changer pour:

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

Ensuite, il a recommencé à fonctionner.

1
Remo

L'analyse psychologique est vraiment minable. Je ne suis pas sûr qu'il s'agisse d'une solution élégante, mais je parviens à résoudre ce problème en le désinstallant.

gem uninstall psych
1
sovanlandy

J'ai eu un problème vraiment très étrange parce que j'avais des espaces après. Par exemple.:

title: "NASA"

N'a pas fonctionné, mais

title:"NASA"

Fait.

1
andrewmart.in

Supprimer les bases de données inutilisées de database.rb. Si vous utilisez MySQL et qu'il n'y a pas de PostgreSQL, supprimez le code de la base de données PG de databases.yml.

1
vijay

Besoin de vérifier les fichiers .yml pour l'erreur, j'ai trouvé le problème dans mon database.yml

1
chaitanya

J'ai eu le même problème avec Ruby 1.9.2-p180, aller à 1.9.2-p290 résolu ceci pour moi

1
Jakob Cosoroaba

Eh bien, juste au cas où cela aiderait ...
Ce que j'ai fait:
- sélectionne tout et copie de https://github.com/svenfuchs/Rails-i18n/tree/master/Rails/locale/es.yml dans un nouvel es.yml avec bloc-notes ++
- a essayé de regarder ce nouveau fichier avec netBeans IDE éditeur de texte, un avertissement concernant le chargement sécurisé avec utf8 (impossible de rappeler le texte exact). Par conséquent, il ne l'a pas ouvert avec cet éditeur de texte.
- a commuté le local via configuration/application.rb i18n
- Lorsque j'ai chargé une page irb, j'ai obtenu "je ne pouvais pas analyser YAML à la ligne 0 colonne 0" en faisant référence à Psych.
- Je suis allé à IRB et j'ai chargé le fichier avec syck, ça allait; est passé à psych et a eu la même erreur.

Comment je l'ai résolu:
- est retourné pour copier le contenu de https://github.com/svenfuchs/Rails-i18n/tree/master/Rails/locale/es.yml mais j'ai collé cette fois dans un fichier nouvellement créé avec l'éditeur netBeans.
- redémarrage de webRick.
- problème résolu.
Meilleures salutations,
Victor

1
Victor Maidana

J'ai eu cette erreur en essayant de me connecter à une base de données distante avec le mot de passe 'p@ssword' et compris que le psy n'aime pas le '@' symbole. Changement du mot de passe de la base de données et résolution du problème.

1
wantrapreneur

Bien que la réponse donnée par @Vicvega puisse ou non fonctionner (ne l’a pas testée), elle va contre Rails et Ruby principe commun " Convention over configuration " et doit être traité avec précaution (et plus encore dans le travail collaboratif) , même si la" configuration "dans ce cas n’est pas excellente

donc mon vote va (si je pouvais voter) pour ceux qui ont proposé d'éliminer les erreurs de syntaxe dans les fichiers YAML.

maintenant ... pour résoudre l’erreur, pour moi c’était une sorte d’erreur newby, je n’avais pas le fichier de paramètres régionaux que j’avais défini comme étant le fichier par défaut dans Config/application.rb dans mon Config/locales répertoire

codage heureux

1
juanm55

J'ai trouvé le problème dans rerun.txt qui s'appelait par config/cucumber.yml dans un Rails app. rerun.txt a été configuré pour stocker le test d'échec de concombre le plus récent et j'avais en quelque sorte saisi des caractères étranges pour un test de concombre dans la console.

C'était difficile à trouver. J'aurais aimé voir réponse de Glenn Rempe il y a quelque temps.

0
webdevguy

L'une des causes possibles est les valeurs de mappage ne sont pas autorisées dans ce contexte à la ligne ...

Voici un exemple YAML incorrect (utilisateur: ne doit contenir aucune valeur, car il contient des éléments enfants some_key et some_other_key)

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

Ce n'est pas une tâche facile de trouver un tel problème, surtout si vous avez un fichier YAML énorme.

J'ai créé une expression rationnelle assez simple pour détecter de telles choses. Je l'ai vérifié dans RubyMine

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

Faites attention! Cela ne fonctionne pas correctement avec des caractères spéciaux comme å ø æ etc.

Faites-moi savoir dans les commentaires si cela a fonctionné pour vous :)

0
Serge Seletskyy