web-dev-qa-db-fra.com

Avertissement de dépréciation de validation Rails I18n

Je viens de mettre à jour Rails 4.0.2 et je reçois cet avertissement:

[obsolète] I18n.enforce_available_locales sera par défaut à true à l'avenir. Si vous voulez vraiment ignorer la validation de vos paramètres régionaux, vous pouvez définir I18n.enforce_available_locales = false pour éviter ce message.

Y at-il un problème de sécurité dans la définition de false?

385
Mauricio Moraes

Important : Assurez-vous que votre application n'utilise pas I18n 0.6.8, elle a un bug qui empêche la configuration de la configuration correctement =.


Réponse courte

Pour faire taire l'avertissement, éditez le fichier application.rb et incluez la ligne suivante dans le corps Rails::Application

config.i18n.enforce_available_locales = true

Les valeurs possibles sont:

  • false : si vous
    • vouloir ignorer la validation des paramètres régionaux
    • ne vous souciez pas des lieux
  • true : si vous
    • veut que l'application génère une erreur si une locale invalide est passée (ou)
    • vouloir adopter les nouveaux comportements Rails (ou)
    • se soucient de la validation des paramètres régionaux

Remarque:

  • L'ancien comportement par défaut correspond à false, pas true.
  • Si vous définissez la configuration config.i18n.default_locale ou d'autres paramètres i18n, assurez-vous de le faire après avoir défini le paramètre config.i18n.enforce_available_locales.
  • Si vous utilisez des gemmes tierces qui incluent des fonctionnalités I18n, la définition de la variable via l'objet Application config risque de ne pas avoir d'effet. Dans ce cas, réglez-le directement sur I18n à l'aide de I18n.config.enforce_available_locales.

    Mises en garde

Exemple

require File.expand_path('../boot', __FILE__)

# ...

module YouApplication
  class Application < Rails::Application

    # ...

    config.i18n.enforce_available_locales = true
    # or if one of your gem compete for pre-loading, use
    I18n.config.enforce_available_locales = true

    # ...

  end
end

Longue réponse

L'avertissement de désapprobation est maintenant affiché à la fois dans Rails 4 (> = 4.0.2) et Rails 3.2 (> = 3.2.14). La raison est expliquée dans this commit .

Appliquer les locales disponibles

Lorsque I18n.config.enforce_available_locales est défini sur true, nous déclencherons une exception I18n :: InvalidLocale si les paramètres régionaux transmis ne sont pas disponibles.

La valeur par défaut est définie sur nil, ce qui affichera une erreur de désapprobation.

Si défini sur false nous ignorerons l'application des paramètres régionaux disponibles (ancien comportement).

Cela a été implémenté dans les méthodes suivantes:

  • I18n.config.default_locale =
  • I18n.config.locale =
  • I18n.translate
  • I18n.localize
  • I18n.transliterate

Avant cette modification, si vous transmettiez des paramètres régionaux non pris en charge, Rails y passerait en mode silencieux si les paramètres régionaux sont valides (c.-à-d. S'il existe un fichier de paramètres régionaux correspondant dans le dossier /config/locales), sinon les paramètres régionaux utiliserait par défaut la configuration config.i18n.default_locale (par défaut: en).

La nouvelle version du joyau I18n oblige les développeurs à être un peu plus conscients de la gestion des paramètres régionaux.

À l'avenir, le comportement changera et si un paramètre régional est invalide, l'application Rails générera une erreur.

En préparation de ce changement (qui pourrait potentiellement bloquer plusieurs applications qui jusqu'à présent reposaient sur des valeurs par défaut silencieuses), l'avertissement vous oblige à déclarer explicitement la validation que vous souhaitez effectuer pendant la période de transition en cours.

Pour restaurer le comportement précédent, définissez simplement la configuration suivante sur false

config.i18n.enforce_available_locales = false

sinon, définissez-le sur true pour qu'il corresponde aux nouveaux paramètres par défaut Rails ou si vous souhaitez être plus strict sur la validation de domaine et éviter de passer à la valeur par défaut en cas de paramètres régionaux non valides.

config.i18n.enforce_available_locales = true

Caveat

  1. Si vous définissez la configuration config.i18n.default_locale ou utilisez l'une des méthodes mentionnées précédemment (default_locale=, locale=, translate, etc.), assurez-vous de le faire après avoir défini la config.i18n.enforce_available_locales réglage. Sinon, l'avertissement de dépréciation continuera à apparaître. (Merci Fábio Batista ).

  2. Si vous utilisez des gemmes tierces incluant des fonctionnalités I18n, la définition de la variable peut ne pas avoir d'effet. En fait, le problème est le même que celui décrit dans le point précédent, juste un peu plus difficile à déboguer.

    Cette question est une question de priorité. Lorsque vous définissez la configuration dans votre application Rails, la valeur n'est pas immédiatement attribuée à la gem I18n. Rails stocke chaque configuration dans un objet interne, charge les dépendances (Railties et gems tiers), puis transmet la configuration aux classes cibles. Si vous utilisez une gemme (ou le plug-in Rails) qui appelle une des méthodes I18n avant que la configuration ne soit affectée à I18n, vous recevrez l'avertissement.

    Dans ce cas, vous devez ignorer la pile Rails et définir immédiatement la configuration sur la gem I18n en appelant

    I18n.config.enforce_available_locales = true
    

    au lieu de

    config.i18n.enforce_available_locales = true
    

    La question est facile à prouver. Essayez de générer une nouvelle application Rails vide et vous verrez que le réglage de config.i18n dans le application.rb fonctionne correctement.

    Si ce n'est pas le cas dans votre application, il existe un moyen simple de déboguer le coupable. Recherchez la gemme i18n dans votre système, ouvrez le fichier i18n.rb et modifiez la méthode enforce_available_locales! pour inclure l'instruction puts caller.inspect.

    La méthode imprimera le stacktrace à chaque appel. Vous pourrez déterminer quelle gemme l'appelle en inspectant le stacktrace (dans mon cas, c'était Authlogic).

    ["/Users/weppos/.rvm/gems/Ruby-2.0.0-p247@application/gems/i18n-0.6.9/lib/i18n.rb:150:in `translate'",
     "/Users/weppos/.rvm/gems/Ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/i18n/translator.rb:8:in `translate'",
     "/Users/weppos/.rvm/gems/Ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/i18n.rb:79:in `translate'",
     "/Users/weppos/.rvm/gems/Ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:68:in `validates_format_of_email_field_options'",
     "/Users/weppos/.rvm/gems/Ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:102:in `block in included'",
     "/Users/weppos/.rvm/gems/Ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `class_eval'",
     "/Users/weppos/.rvm/gems/Ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `included'",
     "/Users/weppos/.rvm/gems/Ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `include'",
     "/Users/weppos/.rvm/gems/Ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `block in acts_as_authentic'",
     "/Users/weppos/.rvm/gems/Ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `each'",
     "/Users/weppos/.rvm/gems/Ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `acts_as_authentic'",
     "/Users/weppos/Projects/application/app/models/user.rb:8:in `<class:User>'",
     "/Users/weppos/Projects/application/app/models/user.rb:1:in `<top (required)>'",
    
614
Simone Carletti

Par souci d’exhaustivité, notez que vous pouvez également supprimer l’avertissement en définissant I18n.enforce_available_locales sur true (ou false) dans config/application.rb:

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .
  end
end
45
mhartl

I18n.config.enforce_available_locales = true a travaillé pour moi dans Rails 3.2.16 (je le mets dans config/application.rb)

15
SpeedyWizard

Cela ne semble pas être le cas - ce serait le comportement précédent de la façon dont i18n fonctionne - un nouveau comportement (true) va générer une erreur lorsque vous demandez des paramètres régionaux non implémentés/disponibles.

Voir le commit qui a ajouté cet avertissement: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c

10
Justin

Si vous voulez vous soucier des locales écrivez dans le fichier appilcation.rb.

config.i18n.enforce_available_locales = true

Vous pouvez écrire false si la validation des paramètres régionaux vous importe peu.

0
Foram Thakral