Rails I18n 検証の非推奨警告 質問する

Rails I18n 検証の非推奨警告 質問する

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

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

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

ベストアンサー1

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


短い答え

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

config.i18n.enforce_available_locales = true

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

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

注記:

  • 以前のデフォルトの動作はfalseではなくに対応しますtrue
  • 構成やその他の i18n 設定を設定する場合はconfig.i18n.default_locale、必ず設定後に行ってください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) の両方で非推奨の警告が表示されるようになりました。その理由はこのコミット

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

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

デフォルトでは、nil非推奨エラーが表示されるように設定されています。

設定すると、false利用可能なロケールの適用が完全にスキップされます (古い動作)。

これは次の方法で実装されています:

  • I18n.config.default_locale=
  • I18n.config.ロケール=
  • I18n.翻訳
  • I18n.ローカライズ
  • I18n.翻訳

この変更の前は、サポートされていないロケールを渡すと、ロケールが有効な場合 (つまり、フォルダー内に対応するロケール ファイルがある場合/config/locales)、Rails は自動的にそのロケールに切り替え、そうでない場合は、ロケールはデフォルトで設定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。そうしないと、非推奨の警告がポップアップ表示され続けます。(ありがとうございます。ファビオ・バティスタ)。

  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.i18nますapplication.rb

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

    これにより、メソッドが呼び出されるたびにスタック トレースが出力されます。スタック トレースを調べることで、どの gem が呼び出しているかを判断できます (私の場合は 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)>'",
    

おすすめ記事