web-dev-qa-db-ja.com

Rails国際化検証廃止予定警告

Rails 4.0.2にアップデートしたところ、次のような警告が表示されます。

[非推奨]将来のI18n.enforce_available_localesはデフォルトでtrueになる予定です。本当にロケールの検証をスキップしたい場合は、このメッセージを避けるためにI18n.enforce_available_locales = falseを設定することができます。

Falseに設定することでセキュリティ上の問題はありますか?

386
Mauricio Moraes

重要:アプリがI18n 0.6.8を使用していないことを確認してください 設定が正しく設定されないバグ


短い答え

警告を黙らせるには、application.rbファイルを編集し、Rails::Application本文内に次の行を含めます

config.i18n.enforce_available_locales = true

可能な値は次のとおりです。

  • false:if
    • ロケール検証をスキップしたい
    • ロケールを気にしない
  • true:if you
    • 無効なロケールが渡された場合にアプリケーションにエラーを発生させたい(または)
    • デフォルトの新しいRails動作にしたい(または)
    • ロケール検証を気にする

注意:

  • 古いデフォルトの動作は、falseではなく、trueに対応しています。
  • config.i18n.default_locale構成または他のi18n設定を設定している場合は、config.i18n.enforce_available_locales設定を設定した後に必ず実行してください。
  • I18n機能を含むサードパーティのgemを使用し、Application configオブジェクトを介して変数を設定しても効果がない場合があります。この場合、I18n。を使用して、I18n.config.enforce_available_localesに直接設定します。

    注意事項

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

長い答え

非推奨の警告がRails 4(> = 4.0.2)とRails 3.2(> = 3.2.14)の両方に表示されるようになりました。理由は this commit で説明されています。

利用可能なロケールを強制する

I18n.config.enforce_available_localesがtrueの場合、渡されたロケールが利用できない場合、I18n :: InvalidLocale例外が発生します。

デフォルトはnilに設定されており、非推奨エラーが表示されます。

falseに設定されている場合、使用可能なロケールの強制はすべてスキップされます(古い動作)。

これは、次のメソッドで実装されています。

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

この変更の前に、サポートされていないロケールを渡した場合、Railsは、ロケールが有効な場合(つまり、/config/localesフォルダーに対応するロケールファイルがある場合)に静かに切り替えます。デフォルトはconfig.i18n.default_locale設定(デフォルトは:en)です。

I18n gemの新しいバージョンでは、開発者はロケール管理をもう少し意識する必要があります。

将来、動作が変更され、ロケールが無効な場合、Railsアプリはエラーを発生させます。

そのような変更(今日までサイレントデフォルトに依存していたいくつかのアプリケーションを破壊する可能性があります)の準備において、警告は、現在の移行期間中に実行する検証を明示的に宣言することを強制します。

以前の動作を復元するには、次の構成をfalseに設定するだけです

config.i18n.enforce_available_locales = false

そうでない場合は、新しいRailsデフォルトに一致するようにtrueに設定するか、ドメイン検証をより厳密にしたい場合、無効なロケールの場合にデフォルトに切り替えないようにします。

config.i18n.enforce_available_locales = true

警告

  1. config.i18n.default_locale構成を設定している場合、または前述の方法(default_locale=locale=translateなど)のいずれかを使用している場合は、config.i18n.enforce_available_locales設定。そうしないと、非推奨の警告がポップアップし続けます。 (ありがとう FábioBatista )。

  2. I18n機能を含むサードパーティのGemを使用する場合、変数を設定しても効果がない場合があります。実際、この問題は前のポイントで説明したものと同じですが、デバッグが少し難しくなります。

    この問題は優先事項です。 Railsアプリで構成を設定しても、値はすぐにI18n gemに割り当てられません。 Railsは各構成を内部オブジェクトに保存し、依存関係(Railtiesおよびサードパーティのgem)をロードしてから、構成をターゲットクラスに渡します。設定がI18nに割り当てられる前にI18nメソッドのいずれかを呼び出すgem(またはRails)プラグインを使用すると、警告が表示されます。

    この場合、Railsスタックをスキップし、次を呼び出すことでI18n gemにすぐに設定を設定する必要があります

    I18n.config.enforce_available_locales = true
    

    の代わりに

    config.i18n.enforce_available_locales = true
    

    問題は簡単に証明できます。新しい空のRailsアプリを生成しようとすると、config.i18napplication.rbの設定が正常に機能することがわかります。

    アプリでそうでない場合は、犯人をデバッグする簡単な方法があります。システムでi18n gemを見つけ、i18n.rbファイルを開き、メソッドenforce_available_locales!を編集してステートメントputs caller.inspectを含めます。

    これにより、メソッドは呼び出されるたびにスタックトレースを出力します。スタックトレース(私の場合はAuthlogic)を調べることで、どのgemがそれを呼び出しているかを判断できます。

    ["/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

完全を期すために、I18n.enforce_available_localesconfig/application.rbtrue(またはfalse)に設定することで警告を取り除くこともできることに注意してください。

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はRails 3.2.16で私のために働きました(私はそれをconfig/application.rbに入れました)

15
SpeedyWizard

そのようには思えません - それは国際化の動作方法の以前の振る舞いでしょう - 新しい振る舞い(true)は、実装されていない/利用できないロケールを要求するとエラーを発生させます。

この警告を追加したコミットを参照してください。 https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c

10
Justin

ロケールを気にしたい場合はappilcation.rbファイルに書いてください。

config.i18n.enforce_available_locales = true

ロケールの検証であればfalseを書くことができ、それを気にする必要はありません。

0
Foram Thakral