2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

バリデーションヘルパーで使用するオプションmessageについて

Last updated at Posted at 2021-02-13

まずバリデーション(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のエラーメッセージ(デフォルト)の場合

model
validates :item, presence: true

 Item can't be blank #デフォルトのエラーメッセージ

:messageオプションをすると

modele
validates :item, presence: { message: "空です" }

 Item 空です #デフォルトのメッセージが変化 can't be blank → 空です

エラーメッセージはブラウザで表示されます。

※ここで言うバリデーションとは→__バリデーションヘルパー__です。

バリデーションヘルパーは__オプション(messageなど)__をつける事ができる。

バリデーションヘルパーとは?

例えば下記のコードで、
__どこからどこまでがバリデーションヘルパー__でしょうか?

学習を始めて、初めてバリデーションを認識した時は、
間違った考え方をしていました(汗)

model
validates :item, presence: true

僕の認識が正しければ、正解は

model
validates :item, presence: true
 presence #これがバリデーションヘルパーです

最初はvalidates :item, presence:までを__バリデーション__という言葉で一括りにして考えていました。

その後、バリデーションヘルパーという言葉を知り、またしてもvalidates :item, presence:全体を__バリデーションヘルパー__と考えてしまいました(汗)

バリデーションヘルパーとバリデーションヘルパーで使えるオプション それぞれの範囲を分解

正しい認識だと信じて、分解して考えます。

※バリデーションヘルパーの種類と、オプションの種類は割愛します。

model
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以上を入力した時で、
__異なるエラーメッセージ__をブラウザ上に表示して欲しい場合。

model
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の中で記述できないのかです。

model
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オプションを付け加えないと、
__異なるエラーメッセージを別々に表示する事ができない__という事です。

model
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つまでである。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?