22

Avoir un problème étrange avec un modèle de rails que je viens de créer.Pourquoi "errors.full_messages" de Rails ne remplace-t-il pas les variables d'attribut et de message?

Voici mes:

validations
validates_presence_of :from_name, :message => 'Please provide a from name.' 
validates_presence_of :from_email 
validates_presence_of :giftition_plan_id 

Je rencontre des problèmes en utilisant errors.full_messages ainsi que f.error_messages sous ma forme:

g = Giftition.create 
g.errors.first 
=> ["from_name", "Please provide a from name."] 
>> g.errors.full_messages 
=> ["{{attribute}} {{message}}", "{{attribute}} {{message}}", "{{attribute}} {{message}}"] 

Je suis juste "{{attribute}} {{message}}". Des idées? MISE À JOUR: J'ai désinstallé les rails 3 et toutes les gemmes qui ont été installées avec et qui ont fait disparaître le problème. Ce n'est pas une solution cependant ... J'aimerais toujours avoir des rails 3 installés. MISE À JOUR: La mise à niveau vers la version 2.3.9 résout le problème. Malheureusement, j'ai abandonné pour l'instant, mais dans le futur je vais essayer ça.

+0

Je viens de me souvenir que je venais d'installer les deux rails 2.3.9 et 3.0.3 ... Mon googling dit que ça a définitivement quelque chose faire avec ... même si je ne trouve pas de solution. – tybro0103

+0

Ruby, Gems and Rails devrait éviter les problèmes avec un conflit, même si vous avez deux versions installées. Si vous voulez supprimer une version de Rails, c'est facile, même si vous voulez faire attention de supprimer la version que vous n'utilisez pas, ou de mettre à niveau vers la version 3.0+ si votre projet était 2.3.9, effectuez la suppression. 'gem uninstall rails -v 2.3.9' –

+2

i18n 0.5.0 a été installé (en tant que dépendance) lorsque j'ai installé la gemme d'ascendance. J'ai fini avec le problème que vous décrivez car je cours Rails 2.3.8. J'ai été en mesure de résoudre ce problème en désinstallant i18n, puis en le réinstallant mais en forçant la version 0.4.0. – GilliMonsta

Répondre

8

Mise à niveau vers la version 2.3.9 rails résout ce problème

gem install -v 2.3.9 rails --include-dependencies 

EDIT:

Vous devez également modifier le fichier config\environment.rb pour modifier le RAILS_GEM_VERSION.

RAILS_GEM_VERSION = '2.3.9' 

EDIT # 2:

Je dois noter que la version 2.3.9 est pas la dernière version de la branche 2.3.x, et vous devez mettre à jour le la dernière version disponible.

+1

Même problème avec Rails 2.3.5. J'ai effectué la mise à jour à 2.3.9 et il fonctionne maintenant comme prévu. – rchampourlier

2

J'ai corrigé localement en supprimant i18n-0.5.0.

expérimenter avec des rendements i18n-0.4.0 (en retournant la chaîne interpolée correctement):

The {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead. 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:160:in `interpolate_without_deprecated_syntax' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:155:in `gsub' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:155:in `interpolate_without_deprecated_syntax' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:188:in `preserve_encoding' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:154:in `interpolate_without_deprecated_syntax' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/i18n_interpolation_deprecation.rb:21:in `interpolate' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:48:in `translate' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n.rb:152:in `translate' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:119:in `resolve' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:104:in `default' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:103:in `each' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:103:in `default' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:41:in `translate' 
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n.rb:152:in `translate' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/validations.rb:78:in `generate_message' 

je suppose 0.5.0 retourne la douleur en produisant des chaînes non-interpolée.


i18n est requis par activesupport, donc la façon dont je me suis chargement dans la version la plus récente (0.5.0) est:

dans config/preinitializer.rb (crochet du cycle de vie 'secret' que les charges avant activesupport):

require 'rubygems' 
begin 
    gem 'i18n', "~> 0.4.0" 
rescue LoadError 
    # no biggie, optional anyway 
end 
+0

Je crois que c'est ce qui "fixe" pour moi aussi, mais notez "fixe" est dans les citations. – tybro0103

12

J'ai également rencontré ce problème avec une ancienne application Rails 2.3.5 dont j'ai hérité. J'ai fait installer la version 5.0 de la gemme i18n. J'ai vu qu'il a besoin de la syntaxe% {}. Faire cela dans config/locales/en.yml fait l'affaire:


en: 
    activerecord: 
    errors: 
     full_messages: 
     format: "%{attribute} %{message}" 
+0

fonctionne comme un charme! – huug

+0

Très bien! Mais maintenant, j'ai toujours des choses comme: "{{count}} erreurs interdit ce {{modèle}} d'être sauvé" – tybro0103

+0

Cela ressemble à un problème de ressources héritées. J'ai vu cela il y a quelques mois mais malheureusement je ne me souviens pas exactement de la correction. En supposant que vous avez hérité des ressources dans le mélange, je regarderais dans cette direction. Bonne chance! –

0

Voici ma config complète/locales/en.yml qui permet de résoudre l'attribut, message, compter, et les questions de modèle.Je suis arrivé ce des documents RoR ici: http://guides.rubyonrails.org/i18n.html

en: activerecord: erreurs: full_messages: Format: "% {attribut}% {message}" modèle: tête: un: « 1 erreur interdit ce% {modèle} d'être sauvé » autre: « erreurs% {count} interdit ce% {modèle} d'être sauvé »

1

Aller à dir_of_ruby/lib/ruby ​​/ gemmes/1.8/gemmes/activerecord-2.3.x/lib/active_record/locale et modifier la en.yml ... remplacer la {{variable}} à% {variable}

A travaillé pour moi ...

PS: peut-être le chemin serait différent pour vous. Adaptez pour votre commodité.

1

Je travaille sur un serveur Rails 2.3.5 au travail qui ne possède pas de gemme i18n. La chose étrange est que pendant que mon code fonctionne localement, j'ai ce problème sur le serveur de travail. Et, une autre application que j'ai avec les mêmes gemmes gelées exactes n'affiche pas ce problème sur le serveur de travail.

J'ai changé le fichier en.yml de activerecord comme ci-dessus, mais aussi changé le fichier en.yml de actionpack pour obtenir le bon message d'erreur titre/en-tête:

\vendor\rails\activerecord\lib\active_record\locale\en.yml 

    #format: "{{attribute}} {{message}}" 
    format: "%{attribute} %{message}" 

    \vendor\rails\actionpack\lib\action_view\local\en.yml 

     activerecord: 
     errors: 
      template: 
      header: 
       one: "1 error prohibited this %{model} from being saved" 
       other: "%{count} errors prohibited this %{model} from being saved"  

Aussi, je ne l'ai pas pris la peine avec elle, mais si vous avez des messages d'erreur qui contiennent des comptes, il semble que dans le fichier en.yml de activerecord vous auriez besoin de changer la syntaxe de certains des messages trop (comme):

#too_long: "is too long (maximum is {{count}} characters)" 
too_long: "is too long (maximum is #{count} characters)" 
+0

Cette technique nécessite-t-elle l'installation de la totalité de la gemme Rails sous 'vendeur /', ou peut-on simplement ajouter les fichiers spécifiques 'en.yml' notés et ils seront récupérés et remplaceront les paramètres régionaux standard de Rails? – ilasno

1
cd <yourRailsProject> 
gem install i18n -v 0.4.0 -i vendor/ -V 

pour installer le i18n gem int o le dossier du vendeur (-V pour une sortie verbeuse, juste pour voir ce qui se passe sous le capot)

+0

vous m'avez vraiment sauvé – Maysam