モデルの属性にバリデーションをかける

# lengthのバリデーションをかけてみる。
```rb
  validates :name, {presence: true, length: { in: 1..10 }}
```
### 空で送信してみた。
```Name can't be blank```
```Name is too short (minimum is 1 character)```
というメッセージが表示された。

### １１以上で送信してみる。
```Name is too long (maximum is 10 characters)```
というメッセージが表示された。

### 気づき
これだけでバリデーションが掛けられている。ことがわかった。

# バリデーションにメッセージオプションをつけてみる
```rb
  validates :name, {presence: true, length: { in: 1..10, message: "1文字以上から10文字以下で入力してください。"}}
```
```Name 1文字以上から10文字以下で入力してください。```と表示された。

### 属性名が表示されたようだ。これを表示しないようにしたい。
```rb
validate :name_is_present

private

# Making this private is optional, but recommended
def name_is_present
  errors.add(:base, "Promo code required") if name.blank?
end
```
.
.
.
```rb
validate :promo_require

def promo_require
  errors.add(:base, 'promo code required') unless name.present?
end
```
#### 出典
https://stackoverflow.com/questions/56742045/how-to-add-custom-validation-message-on-field-name-without-field-name-as-a-prefi

### 気づき
どうやら```errors.add```を使うようだ。

### 7.4 errors.add
addメソッドを使って、特定の属性に関連するエラーメッセージを手動で追加できます。このメソッドは、属性とエラーメッセージを引数として受け取ります。
```rb
class Person < ApplicationRecord
  validate do |person|
    errors.add :name, :too_plain, message: "はあまりクールじゃない"
  end
end
```
```rb
irb> person = Person.create
irb> person.errors.where(:name).first.type
=> :too_plain
irb> person.errors.where(:name).first.full_message
=> "Nameはあまりクールじゃない"
```
#### 出典
https://railsguides.jp/active_record_validations.html#errors-add:~:text=7.4%20errors.add,Name%E3%81%AF%E3%81%82%E3%81%BE%E3%82%8A%E3%82%AF%E3%83%BC%E3%83%AB%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%22

### ```:too_plain```とは？
```rb
irb(main):001:0> user = User.create
  TRANSACTION (0.2ms)  BEGIN
  TRANSACTION (2.1ms)  SAVEPOINT active_record_1
  User Exists? (1.2ms)  SELECT 1 AS one FROM `users` WHERE `users`.`email` IS NULL LIMIT 1
  TRANSACTION (2.5ms)  ROLLBACK TO SAVEPOINT active_record_1
=>
#<User:0x000000011594d5e8
...
irb(main):002:0> user.errors.where(:name).first.type
=> :blank
```
```rb
irb(main):004:0> user = User.create(name:"aaaaaaaaaaaa")
  TRANSACTION (0.2ms)  SAVEPOINT active_record_1
  User Exists? (0.3ms)  SELECT 1 AS one FROM `users` WHERE `users`.`email` IS NULL LIMIT 1
  TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
=>
#<User:0x0000000115cc40f0
...
irb(main):005:0> user.errors.where(:name).first.type
=> :too_long
```
### 気づき
* 属性が空だと```:blank```
* 制限を超えていると```:too_long```が表示されるのか
エラーの原因の型があるのか。

# エラーメッセージの最初の属性名を消す
しかしこれであっているかはわからない。が```消すことだけ```はできた。
```config/locales/en.yml```か```config/locales/ja.yml```
```yaml
.
.
.
  ja:
  errors:
    format:
      "%{message}"
```
### 出典
https://qiita.com/tatsugon14/items/1533bf3cad7489f2c621

https://www.bigbinary.com/blog/rails-6-allows-to-override-the-activemodel-errors-full_message-format-at-the-model-level-and-at-the-attribute-level#:~:text=en%3A,%22%27%25%7Battribute%7D%27%20%25%7Bmessage%7D%22

```rb
validate :name_is_present

private

# Making this private is optional, but recommended
def name_is_present
  errors.add(:base, "Promo code required") if name.blank?
end
```
これを真似するといつでもこのエラーメッセージが発生してしまう。
まだ自分の検証が足りないのかもしれない。

### 属性名が最初に入る理由は```errors.add```の仕様
属性とエラーメッセージを引数として受け取ります。
なので属性が先頭に来る。
#### 出典
https://qiita.com/ryuuuuuuuuuu/items/27987c73888f1decb7b4

https://railsguides.jp/active_record_validations.html#errors-where%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88:~:text=%E5%B1%9E%E6%80%A7%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E5%BC%95%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

https://www.bigbinary.com/blog/rails-6-allows-to-override-the-activemodel-errors-full_message-format-at-the-model-level-and-at-the-attribute-level

# 検索
```バリデーション メッセージ 属性名 rails```