msfukuiの日記

おおまさのみみはそらのみみ。

validates のエラーメッセージを一つだけ固定にしたい。(できなかったよ..。)

2 日間散々悩んで、activemodel の errors.rb を読み、カスタムバリデーションまで作った挙句、結局できなかった。
以下、xxか月後の自分に向けたメモ。

環境

ruby 2.0.0
rails 4.0.0 (active model 4.0.0)
i18n でエラーメッセージは日本語メッセージを設定している。

やりたいこと

パスワードの変更画面があって、新しいパスワードの入力欄と再入力の欄を用意している。

新しいパスワードの入力欄と再入力の欄の内容が違う場合に、

「新しいパスワードと再入力のパスワードが一致していません。」

という固定のメッセージをエラーメッセージとして出したい。

やったこと

入力フォームの各項目の名称を、それぞれ、

「新しいパスワード」
「再入力のパスワード」

と定義して validates の confirmation を使ってみたところ、出たメッセージは、

「再入力のパスワードと新しいパスワードが一致していません。」

...。惜しい。でも逆にしたいの..。

一瞬、項目の定義を逆にすることが頭によぎったけれども、さすがにいやいやと思い直してのそこからが長かった。

結局、以下のようにしてみたけど、逆にした方がまだかえって良かったかもしれぬ。

  • 再入力の入力フォームの名称のみを空文字列に。
  • 固定のエラーメッセージを「新しいパスワードと再入力のパスワードが一致していません。」として yaml に定義。
  • validates :new_password, confirmation: { message: I18n.t( [yamlの定義先] ) } としてエラーメッセージを上書き。

わからなかったこと

  • 項目の名称をプログラム内で動的に空にする方法。
  • エラーメッセージの既定の format: ! '%{attribute}%{message}' をプログラム内で動的に上書きする方法。(errors.format は private だって言われて書き換えられなかった..。)

すごい小さいことだけど、これはきっと、使う人と作る人のギャップの話(使う人には簡単だと思うけど作る人には難しい)の典型なのかなー、と思ったりしました。

でも単に、フレームワークの中身をわからないまま使うんじゃない、という話の様な気はする。