[解決済み] Rails I18n バリデーション非推奨の警告
質問
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
洞窟
-
を設定している場合
config.i18n.default_locale
の設定や、先に述べた方法 (default_locale=
,locale=
,translate
など) を設定した後に行うようにしてください。config.i18n.enforce_available_locales
を設定します。そうしないと、非推奨の警告がずっと出続けます。(ありがとうございます ファビオ・バティスタ ). -
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)>'",
関連
-
[解決済み】Rails。Ruby on Railsの移行でデータベースカラムの名前を変更するにはどうすればよいですか?
-
[解決済み】OS X Yosemite 10.10.5 で [Ruby on Rails] 5 をインストールすると extconf が失敗して終了コード 1 エラーになる。
-
[解決済み] Ruby/Rails の「フック」とは何ですか?
-
[解決済み] バリデーションなしで属性を更新する方法
-
[解決済み] サーバーはRailsで既に稼働している
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Rails 4で懸念事項を使用する方法
-
[解決済み】Railsの認証トークンを理解する
-
[解決済み】Rails 4 認証トークン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コントローラでJSONをレンダリングする
-
[解決済み】ActionController::InvalidAuthenticityTokenについて
-
[解決済み】コレクションをDESCで並べる方法
-
[解決済み】Webpacker::Manifest::MissingEntryError【クローズド
-
[解決済み] Ruby on Railsのためにnetbeansを構成する方法は?
-
[解決済み] Errno::EACCESS: パーミッションが拒否された @ dir_s_mkdir
-
[解決済み] Railsです。gemを使った特定バージョンのライブラリのアンインストール
-
[解決済み] railsでhidden fieldタグを使用する方法
-
[解決済み] RubyとRailsの "Date.today "フォーマット
-
[解決済み] ActionController::RoutingError: 初期化されていない定数MicropostsController