日々精進

新しく学んだことを書き留めていきます

Rails - エラーメッセージをまとめる

RailsではDBにデータを保存するときやvalid?メソッドが実行されたときに
モデルに記述したvalidatesヘルパやvalidateメソッドでモデルの値を検証する。
エラーがあったらerror_messages_forで「〜の値が不正ですよ!」みたいなメッセージを表示するわけだが、
コレに関するTipsをまとめておく。


1.エラーメッセージをまとめる
複数のモデルを保存する場合

	<%= error_messages_for :user %>
	<%= error_messages_for :person %>

↑のように書くと、メッセージが別々に表示される。
エラーメッセージの例は↓

2 errors prohibited this user from being saved

There were problems with the following fields:

    * Secret answer can't be blank
    * Password is invalid

1 error prohibited this person from being saved

There were problems with the following fields:

    * Email のフォーマットが正しくありません。



まとめたい時は↓のように書く。

	<%= error_messages_for :user, :person %>

エラーメッセージの例は↓

3 errors prohibited this user from being saved

There were problems with the following fields:

    * Secret answer can't be blank
    * Password is invalid
    * Email のフォーマットが正しくありません。



2.メッセージの日本語化
A. ↓を実行。

gem install gettext

B. environment.rbの最後に↓を追記

require 'gettext/rails'

C. apprication.rbのクラス内に↓を追記

init_gettext "myapp" #myappは任意のアプリ名

D. ruby\gems\1.8\gems\gettext-1.92.0\samples\rails\lib\tasksのgettext.rakeを(Railsアプリのフォルダ)/lib/taskにコピー。
E. ↓をRailsアプリのフォルダで実行

rake updatepo

F. ↓みたいな感じでモデルの中でカラム名の日本語名称を設定する。

set_field_names :title => 'タイトル', :url => 'URL'

3.トラブルシューティング(というか俺がはまった現象orz)
E.の操作を実行した時に↓のメッセージが出る。

rake aborted!
undefined method `label' for class `ActionView::Helpers::FormBuilder'

原因1:gettextの1.90以降がRails2.0以降にしか対応していないため
対応1:Rails開発日記: undefined method `label' for class `ActionView::Helpers::FormBuilderを参照のこと。
原因2:Rails2.0使ってるよ?という人はrake rails:freeze:gemsを過去に実行してませんか?
対応2:そんな場合はrake rails:unfreezeを実行すればOK。


E.の操作を実行した時に↓のメッセージが出る。

No such file or directory - msgmerge --version

原因&対応:railsで変なの作るよ 番外編 〜GetText vs Windows〜 - 割と意味はないを参照。