1. ホーム
  2. ruby-on-rails

[解決済み] Rails I18n バリデーション非推奨の警告

2022-03-24 16:28:36

質問

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

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

falseにすることで、セキュリティ上の問題はないのでしょうか?

解決方法は?

重要 : アプリがI18n 0.6.8を使用していないことを確認し、そのアプリには が正しく設定されないというバグがあります。 .


短い回答

警告を消すには、application.rbファイルを編集し、以下の行をapplication.rbの中の Rails::Application 本体

config.i18n.enforce_available_locales = true

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

  • 虚偽 : もし、あなたが
    • ロケール検証をスキップしたい
    • ロケールにこだわらない
  • : もし、あなたが
    • 無効なロケールが渡された場合にエラーを発生させたい(または)
    • Railsの新しい挙動をデフォルトにしたい (または)
    • ロケール検証を気にする

  • 旧来のデフォルトの動作は、以下のものに相当します。 false ではなく true .
  • を設定する場合は config.i18n.default_locale の設定やその他の国際化設定をした後に行うようにしてください。 config.i18n.enforce_available_locales を設定します。
  • I18n 機能を含むサードパーティーの gems を使用している場合、アプリケーションの変数設定から 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) の両方で、非推奨の警告が表示されるようになったそうです。その理由については このコミット .

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

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

デフォルトは nil これは非推奨のエラーを表示します。

に設定すると false は、使用可能なロケールの強制を完全にスキップします (古い動作です)。

これは、以下のメソッドに実装されています。

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

この変更前は、サポートされていないロケールを渡しても、そのロケールが有効であれば (つまり、対応するロケールファイルが /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 を設定します。そうしないと、非推奨の警告がずっと出続けます。(ありがとうございます ファビオ・バティスタ ).

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

    この問題は、優先順位の問題です。Railsアプリでconfigを設定しても、その値がすぐにI18n gemに代入されるわけではありません。Railsは各configを内部オブジェクトに格納し、依存関係(Railtiesやサードパーティのgem)をロードしてから、ターゲットクラスに設定を渡しています。configがI18nに割り当てられる前にI18nメソッドのいずれかを呼び出すgem(またはRailsプラグイン)を使用した場合、警告が表示されます。

    この場合、Railsのスタックをスキップして、コンフィグをすぐにI18n gemに設定する必要があります。

    I18n.config.enforce_available_locales = true
    
    

    ではなく

    config.i18n.enforce_available_locales = true
    
    

    この問題を証明するのは簡単です。空のRailsアプリを新規に生成してみると、設定した config.i18n の中に application.rb は正常に動作します。

    もし、あなたのアプリでそうならない場合、その原因を簡単にデバッグする方法があります。システムで国際化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)>'",