web-dev-qa-db-de.com

Warnung zur Abwertung der Rails I18n-Validierung

Ich habe gerade ein Update auf Rails 4.0.2 durchgeführt und erhalte folgende Warnung:

[veraltet] I18n.enforce_available_locales wird in der Zukunft auf true gesetzt. Wenn Sie die Überprüfung Ihres Gebietsschemas wirklich überspringen möchten, können Sie I18n.enforce_available_locales = false festlegen, um diese Nachricht zu vermeiden.

Gibt es ein Sicherheitsproblem, wenn es falsch gesetzt wird?

385
Mauricio Moraes

Important: Stellen Sie sicher, dass Ihre App nicht I18n 0.6.8 verwendet. Sie hat einen Fehler, der die korrekte Konfiguration der Konfiguration verhindert .


Kurze Antwort

Um die Warnung zum Schweigen zu bringen, bearbeiten Sie die Datei application.rb und fügen Sie die folgende Zeile in den Körper Rails::Application ein

config.i18n.enforce_available_locales = true

Die möglichen Werte sind:

  • false: wenn Sie
    • möchte die Überprüfung der Ländereinstellung überspringen
    • kümmere dich nicht um Schauplätze
  • true: wenn Sie
    • möchte, dass die Anwendung einen Fehler ausgibt, wenn ein ungültiges Gebietsschema übergeben wird (oder)
    • möchte das neue Rails-Verhalten standardmäßig verwenden (oder)
    • achten Sie auf die Überprüfung der Ländereinstellung

Hinweis:

  • Das alte Standardverhalten entspricht false, nicht true.
  • Wenn Sie die config.i18n.default_locale-Konfiguration oder andere i18n-Einstellungen festlegen, stellen Sie sicher, dass Sie dies tun, nachdem Sie die config.i18n.enforce_available_locales-Einstellung festgelegt haben.
  • Wenn Sie Drittanbieter-Gems verwenden, die I18n-Funktionen enthalten, hat das Festlegen der Variablen über das Application config-Objekt möglicherweise keine Auswirkungen. Setzen Sie es in diesem Fall mit I18n..__ direkt auf I18n.config.enforce_available_locales.

    Vorsichtsmaßnahmen

Beispiel

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

Lange Antwort

Die Abmahnungswarnung wird jetzt sowohl in Rails 4 (> = 4.0.2) als auch in Rails 3.2 (> = 3.2.14) angezeigt. Der Grund wird in diesem Commit erklärt.

Erzwingen Sie verfügbare Ländereinstellungen

Wenn I18n.config.enforce_available_locales wahr ist, schreiben wir eine I18n :: InvalidLocale-Ausnahme, wenn das übergebene Gebietsschema nicht verfügbar ist.

Der Standardwert ist nil, wodurch ein Verfallsfehler angezeigt wird.

Wenn false eingestellt ist, überspringen wir die Ersetzung der verfügbaren Ländereinstellungen insgesamt (altes Verhalten).

Dies wurde in den folgenden Methoden implementiert:

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

Wenn Sie vor dieser Änderung ein nicht unterstütztes Gebietsschema übergeben, wechselt Rails unbemerkt zu diesem Gebiet, wenn das Gebietsschema gültig ist (dh, wenn sich eine entsprechende Gebietsschemadatei im Ordner /config/locales befindet). Andernfalls würde das Gebietsschema standardmäßig die config.i18n.default_locale-Konfiguration verwenden (die Standardeinstellung ist) : en).

Die neue Version des I18n-Gems zwingt die Entwickler, sich mit dem Gebietsschema-Management ein wenig zu beschäftigen.

In Zukunft wird sich das Verhalten ändern, und wenn ein Gebietsschema ungültig ist, wird in der Rails-App ein Fehler angezeigt. 

Bei der Vorbereitung einer solchen Änderung (die möglicherweise dazu führt, dass mehrere Anwendungen, die bis heute stille Standardeinstellungen verwendet haben, möglicherweise beschädigt werden), werden Sie durch die Warnung dazu gezwungen, explizit anzugeben, welche Validierung Sie während des aktuellen Übergangszeitraums durchführen möchten.

Um das vorherige Verhalten wiederherzustellen, setzen Sie einfach die folgende Konfiguration auf false.

config.i18n.enforce_available_locales = false

setzen Sie ihn ansonsten auf "true", um den neuen Rails-Standardeinstellungen zu entsprechen, oder wenn Sie bei der Domänenvalidierung strenger sein möchten und bei einem ungültigen Gebietsschema nicht auf den Standard wechseln möchten.

config.i18n.enforce_available_locales = true

Vorbehalt

  1. Wenn Sie die config.i18n.default_locale-Konfiguration einstellen oder eine der zuvor genannten Methoden verwenden (default_locale=, locale=, translate usw.), stellen Sie sicher, dass Sie dies tun, nachdem Sie die Einstellung config.i18n.enforce_available_locales festgelegt haben. Andernfalls wird die Warnung über veraltete Informationen weiterhin angezeigt. (Danke Fábio Batista ).

  2. Wenn Sie Drittanbieter-Gems verwenden, die I18n-Funktionen enthalten, hat das Setzen der Variablen durch möglicherweise keine Wirkung. In der Tat ist das Problem dasselbe wie im vorherigen Punkt beschrieben, nur ein wenig schwieriger zu debuggen. 

    Dieses Problem hat Vorrang. Wenn Sie die Konfiguration in Ihrer Rails-App festlegen, wird der Wert nicht sofort dem I18n gem zugewiesen. Rails speichert jede Konfiguration in einem internen Objekt, lädt die Abhängigkeiten (Railties und Drittanbieter-Gems) und übergibt die Konfiguration an die Zielklassen. Wenn Sie einen Edelstein (oder ein Rails-Plugin) verwenden, der eine der I18n-Methoden aufruft, bevor die Konfiguration I18n zugewiesen wird, erhalten Sie die Warnung.

    In diesem Fall müssen Sie den Rails-Stack überspringen und die Konfiguration durch Aufruf sofort auf den I18n-Gem setzen

    I18n.config.enforce_available_locales = true
    

    anstatt

    config.i18n.enforce_available_locales = true
    

    Das Problem ist leicht zu beweisen. Versuchen Sie, eine neue leere Rails-App zu generieren, und Sie werden feststellen, dass die Einstellung config.i18n in application.rb gut funktioniert.

    Wenn dies in Ihrer App nicht der Fall ist, gibt es eine einfache Möglichkeit, den Täter zu debuggen. Suchen Sie den i18n-Edelstein in Ihrem System, öffnen Sie die i18n.rb-Datei und bearbeiten Sie die Methode enforce_available_locales!, um die Anweisung puts caller.inspect einzuschließen.

    Dies bewirkt, dass die Methode den Stacktrace bei jedem Aufruf druckt. Sie können feststellen, welcher Edelstein ihn anruft, indem Sie den Stacktrace untersuchen (in meinem Fall war es Authlogic).

    ["/Users/weppos/.rvm/gems/[email protected]/gems/i18n-0.6.9/lib/i18n.rb:150:in `translate'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/i18n/translator.rb:8:in `translate'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/i18n.rb:79:in `translate'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:68:in `validates_format_of_email_field_options'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:102:in `block in included'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `class_eval'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `included'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `include'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `block in acts_as_authentic'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `each'",
     "/Users/weppos/.rvm/gems/[email protected]/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)>'",
    
613
Simone Carletti

Der Vollständigkeit halber sei darauf hingewiesen, dass Sie die Warnung auch beseitigen können, indem Sie I18n.enforce_available_locales auf true (oder false) in config/application.rb setzen:

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 arbeitete für mich in Rails 3.2.16 (ich habe es in config/application.rb gestellt)

15
SpeedyWizard

Scheint nicht so - dies wäre ein früheres Verhalten der Funktionsweise von i18n - neues Verhalten (true) führt zu einem Fehler, wenn Sie nach einem nicht implementierten/verfügbaren Gebietsschema fragen.

Siehe das Commit, das diese Warnung hinzugefügt hat: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c

10
Justin

Wenn Sie sich um Lokalisierungen kümmern wollen, schreiben Sie in die appilcation.rb-Datei.

config.i18n.enforce_available_locales = true

Sie können "false" schreiben, wenn das Gebietsschema validiert ist.

0
Foram Thakral