Rails はデフォルトでエラーメッセージを英語で出力する。
でも当然我々が作るシステムでは、日本語で表示されるのが求められる。
解決策の一つに gettext がある。
導入するだけで、エラーメッセージのうち項目名以外は日本語化される。
だが、本来 gettext は i18n のためのライブラリであり、エラーメッセージのためだけに導入するには大きすぎると思う。
view や model を更新するたび、po ファイルを作り、翻訳して、mo ファイルを作るなんてやってられない。
個人的にはエラーのサマリを表示するより、ASP.NET の validator のように項目の周囲にメッセージを表示してやる形式のほうが個人的には好きなので、そもそも項目名が必要ない。
項目名が必要なければ ActiveRecord::Errors.default_error_messages を上書きしてやるだけで事足りる。
というわけで、項目名を表示させないようにする。
各モデルの errors には ActiveRecord::Errors#add を介してエラーメッセージが蓄えられる。
add メソッドの宣言は def add(attribute, msg) となっており、attribute に項目名が、msg にエラーメッセージが渡される。
ここではじめは下記のようにしてみた。(active_record_extension.rb として initializers ディレクトリに配置)
が、ダメっ!!
エラーメッセージが表示されなくなってしまった。
それもそのはず、attribute をキーにしてフィールドごとのエラーメッセージをハッシュに格納しているからだ。
というか、attribute はそもそもシンボルだろうし、表示される項目名というよりモデルのフィールド名だし。
なので別の手段を考える。
add メソッドの msg には、例えば %{fn} is empty. のような文字列が渡されてくる。
この %{fn} が項目名に置換されるので、%{fn} を取り除いてやればいいのだ。
というわけで、下記のように修正する。
これでバッチリ項目名は表示されなくなった。
あとは、environment.rb に下記を追加しておしまい。
文字列置換という力技ではあるけれども、現状はこれで問題ないのでしばらく様子見。
error_message_for のように、サマリ表示したい場合は、下記の記事が参考になると思います。
ActiveRecord::Errorsあたりのローカライズ [ハードコアシステム開発]
validationのエラーメッセージ(error_messages_for)の日本語化 [Slow Dance]
優しいRailsの育て方 [ノk|*‘-‘)<ノリマツ!愛だよ、愛!]