rails 4.0.2にアップデートしたところ、次の警告が表示されました。
[非推奨] I18n.enforce_available_localesは将来的にデフォルトでtrueになります。本当にロケールの検証をスキップしたい場合は、I18n.enforce_available_locales = falseを設定してこのメッセージを回避できます。
falseに設定することでセキュリティ上の問題はありますか?
rails 4.0.2にアップデートしたところ、次の警告が表示されました。
[非推奨] I18n.enforce_available_localesは将来的にデフォルトでtrueになります。本当にロケールの検証をスキップしたい場合は、I18n.enforce_available_locales = falseを設定してこのメッセージを回避できます。
falseに設定することでセキュリティ上の問題はありますか?
回答:
重要:アプリがI18n 0.6.8を使用していないことを確認してください。設定が正しく設定されないバグがあります。
警告を止めるには、application.rbファイルを編集し、Rails::Application
本文に次の行を含めます。
config.i18n.enforce_available_locales = true
可能な値は次のとおりです。
注意:
false
はなくに対応していtrue
ます。config.i18n.default_locale
の構成や他の国際化の設定を、設定した後にそれを行うことを確認してconfig.i18n.enforce_available_locales
設定を。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で渡されたロケールが使用できない場合、我々は国際化:: 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
それ以外の場合は、それをtrueに設定して新しいRailsのデフォルトに一致させるか、ドメインの検証を厳格に行い、ロケールが無効な場合にデフォルトに切り替えないようにします。
config.i18n.enforce_available_locales = true
あなたが設定している場合はconfig.i18n.default_locale
設定をまたは前述の方法(のいずれか使用してdefault_locale=
、locale=
、translate
、など)を、設定した後にそれを行うことを確認してconfig.i18n.enforce_available_locales
設定を。そうしないと、非推奨の警告がポップアップし続けます。(FábioBatistaに感謝します)。
I18n機能を含むサードパーティの宝石を使用する場合、変数を設定しても効果がない場合があります。実際、問題は前のポイントで説明したものと同じで、デバッグが少し難しいだけです。
この問題は優先順位の問題です。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
。
これにより、メソッドが呼び出されるたびにスタックトレースが出力されます。スタックトレース(私の場合は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)>'",
config.i18n.default_locale
構成を設定する場合は、新しい設定を行った後で必ず構成してくださいconfig.i18n.enforce_available_locales
。それ以外の場合、非推奨の警告が表示され続けます。
I18n.enforce_available_locales = true
た場合にのみ機能します。config.i18n.enforce_available_locales = true
動作しません。
I18n.config.enforce_available_locales
ませんI18n.config.i18n.enforce_available_locales
。あなたの回答を編集しました。修正してくれてありがとう。
I18n.config.available_locales = [:your_locale, :en]
たとえば、設定する必要があることに注意してください。そうしないと、Railsサーバーを起動できなくなります。
完全を期すために、次のI18n.enforce_available_locales
ようにtrue
(またはfalse
)を設定することで警告を取り除くこともできますconfig/application.rb
。
require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
class Application < Rails::Application
.
.
.
I18n.enforce_available_locales = true
.
.
.
end
end
config.i18n.enforce_available_locales = true
んか?
I18n.config
、これを有効にするために通過する必要がありました
config.i18n.enforce_available_locales = true
config / application.rbで、Rails 4.0.2で非推奨の警告が取り除かれましたが、他のconfig.i18n
行の上に置いた場合のみです。
I18n.config.enforce_available_locales = true
Rails 3.2.16で私のために働いた(私はそれをconfig / application.rbに入れました)
そのようには見えません-それはi18nが動作する方法の以前の動作です-新しい動作(true)は、実装されていない/利用できないロケールを要求するとエラーを発生させます。
この警告を追加したコミットを参照してください:https : //github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c
Rails 4.0.1
アプリケーションにも起こります。