まずバリデーション(validates)とは
入力欄に制限をかける機能__のことを__バリデーション(validates)といいます。
例えば、
フォームに記述した値や文字を送信した時に、
正しい入力がされていないと、
「正しい情報を入力してください」というエラーメッセージが出てきます。
詳しく知りたい場合、下記の参考文献を参照してください
https://wa3.i-3-i.info/word11610.html
https://qiita.com/k152744/items/dfd0e8bd94e842436101
https://railsguides.jp/active_record_validations.html
messageオプションとは
バリデーションの、
エラーメッセージを設定することが出来ます。
もし、このオプションがない場合には、
__デフォルトのメッセージが表示__されます。
例えば、下記のvalidatesのエラーメッセージ(デフォルト)の場合
validates :item, presence: true
→ Item can't be blank #デフォルトのエラーメッセージ
:messageオプションをすると
validates :item, presence: { message: "空です" }
→ Item 空です #デフォルトのメッセージが変化 can't be blank → 空です
※エラーメッセージはブラウザで表示されます。
※ここで言うバリデーションとは→__バリデーションヘルパー__です。
※バリデーションヘルパーは__オプション(messageなど)__をつける事ができる。
バリデーションヘルパーとは?
例えば下記のコードで、
__どこからどこまでがバリデーションヘルパー__でしょうか?
学習を始めて、初めてバリデーションを認識した時は、
間違った考え方をしていました(汗)
validates :item, presence: true
僕の認識が正しければ、正解は
validates :item, presence: true
→ presence #これがバリデーションヘルパーです
最初はvalidates :item, presence:までを__バリデーション__という言葉で一括りにして考えていました。
その後、バリデーションヘルパーという言葉を知り、またしてもvalidates :item, presence:全体を__バリデーションヘルパー__と考えてしまいました(汗)
バリデーションヘルパーとバリデーションヘルパーで使えるオプション それぞれの範囲を分解
正しい認識だと信じて、分解して考えます。
※バリデーションヘルパーの種類と、オプションの種類は割愛します。
validates :item, presence: { message: "空です" }
→ validates :item # itemカラムのバリデーションを宣言する
→ presence: # バリデーションヘルパー
→ { message: "空です" } # バリデーションヘルパーが使えるオプション (今回はmessage:がオプションで、"空です"がmessage:オプションの引数)
バリデーションヘルパーの種類と、オプションの種類、
詳しく知りたい方は、下記の参考文献を参照してください。
https://railsguides.jp/active_record_validations.html
https://qiita.com/h1kita/items/772b81a1cc066e67930e
異なる条件でエラーメッセージを別々に分けたい場合
今回この記事を書く理由になった事です。
どういう事なのか?
半角数字以外を入力した時と、
300以下、9999999以上を入力した時で、
__異なるエラーメッセージ__をブラウザ上に表示して欲しい場合。
VALID_PRICEL_HALF = /\A[0-9]+\z/ # 半角数字以外を外す
validates :price, presence: true,
numericality: { with: VALID_PRICEL_HALF, message: 'Half-width number' }
validates :price, numericality: {
greater_than_or_equal_to: 300, less_than_or_equal_to: 9_999_999,
message: 'Out of setting range' }
半角数字以外を入力した時
エラーメッセージは → Price Half-width number
300以下、9999999以上を入力した時
エラーメッセージは → Price Out of setting range
になります。
僕が疑問に思ったのは、なぜ一緒のvalidatesの中で記述できないのかです。
VALID_PRICEL_HALF = /\A[0-9]+\z/ # 半角数字以外を外す
validates :price, presence: true,
numericality: { with: VALID_PRICEL_HALF,
message: 'Half-width number',
greater_than_or_equal_to: 300,
less_than_or_equal_to: 9_999_999,
message: 'Out of setting range' }
まとめて記述しても大丈夫だと思っていました(汗)
※priceカラムの型が__integer__なので、numericality:を使っています。
※numericality:は__バリデーションヘルパー__です。
1つのバリデーションヘルパーに、message:オプションは1つまで
なるほど。
そういうルールがあったのか。。。
validates :price, presence:を一括りにバリデーション(バリデーションヘルパー)って考えてはダメなんだなと、ここでようやく気付きました(泣)
1つのバリデーションヘルパーに、
__messageオプションは一つまで__というルールがあります。
したがって、
もう一度、validates :priceでpriceカラムのバリデーションを宣言して、
もう一度、numericality:でバリデーションヘルパーを設定して、
messageオプションを付け加えないと、
__異なるエラーメッセージを別々に表示する事ができない__という事です。
VALID_PRICEL_HALF = /\A[0-9]+\z/ # 半角数字以外を外す
validates :price, presence: true,
numericality: { with: VALID_PRICEL_HALF, message: 'Half-width number' }
validates :price, numericality: {
greater_than_or_equal_to: 300, less_than_or_equal_to: 9_999_999,
message: 'Out of setting range' }
※難しく考えているかもしれません。
他に簡単な方法がある場合教えてください。
まとめ
バリデーションという言葉の定義は、
①バリデーションを宣言するカラム名と、
②設定したいバリデーションヘルパーと、
③必要に応じて使いたいオプションをバリデーションヘルパーに付け加える
①〜③を一括りにしてバリデーションと定義すること。
1つのバリデーションヘルパーに、messageオプションは1つまでである。