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

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

```rb:model
validates :item, presence: true

→ Item can't be blank #デフォルトのエラーメッセージ
```
:messageオプションをすると

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

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

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

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

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


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

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

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

```rb:model
validates :item, presence: true
```

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

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

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

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


# バリデーションヘルパーとバリデーションヘルパーで使えるオプション それぞれの範囲を分解
正しい認識だと信じて、分解して考えます。

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

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


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

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

```rb: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つまでである。