has_secure_passwordとは

# has_secure_passwordは検証もしている。
### 前
```rb
has_secure_password
.
.
.
  validates :password, presence: true,
                       length: { minimum: 6},
                       allow_nil: true

```
## バリデーションに引っかかってみる
```can't be blank```
```is too long (maximum is 20 characters)```
```can't be blank```
### errorの配列を見てみる。
```
 #<ActiveModel::Errors [#<ActiveModel::Error attribute=password, type=blank, options={}>, #<ActiveModel::Error attribute=name, type=too_long, options={:count=>20}>, #<ActiveModel::Error attribute=email, type=blank, options={}>]>
```
と表示された。
なぜパスワード属性のエラーメッセージが表示されるかわからなかった。

### 調べていると
validations: false のときは、validation のチェックをしません。
#### 出典
https://qiita.com/suketa/items/e0eea59af9843f2a4f4c#:~:text=validations%3A%20false%20%E3%81%AE%E3%81%A8%E3%81%8D%E3%81%AF%E3%80%81validation%20%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82

と書いてあった。
```has_secure_password```もバリデーションをしていることに気づいた。
### 後にしてみた。
```rb
.
.
.
has_secure_password
  validates :password, presence: true,
                       length: { minimum: 6}                       
```

```
#<ActiveModel::Errors [#<ActiveModel::Error attribute=name, type=too_long, options={:count=>20}>, #<ActiveModel::Error attribute=email, type=blank, options={}>, #<ActiveModel::Error attribute=password, type=blank, options={}>]>
```
password属性のエラーメッセージが後に表示された。
これで```has_secure_password```がバリデーションをしていることがわかった。

# has_secure_passwordとは?
* presence 指定された属性が空（empty）でないこと

https://railsguides.jp/active_record_validations.html#presence:~:text=%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E5%B1%9E%E6%80%A7%E3%81%8C%E7%A9%BA%EF%BC%88empty%EF%BC%89%E3%81%A7%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8

* length 属性の値の長さを検証　
* 72文字以内```is too long (maximum is 72 characters)```

https://railsguides.jp/active_record_validations.html#length:~:text=%E3%81%93%E3%81%AE%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E3%81%AF%E3%80%81-,%E5%B1%9E%E6%80%A7%E3%81%AE%E5%80%A4%E3%81%AE%E9%95%B7%E3%81%95%E3%82%92%E6%A4%9C%E8%A8%BC,-%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E5%A4%9A%E3%81%8F

* Confirmation of password (using a XXX_confirmation attribute)
    多分```password_confirmation```のようなもう一つの属性対してもバリデーションを行う。

https://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html#:~:text=Confirmation%20of%20password%20(using%20a%20XXX_confirmation%20attribute)

* ```XXX_confirmation```のような確認用のパスワードが必要ない場合は、描かなくてもいい。バリデーションは発生しない。
* ```has_secure_password(validations:false)```にするとバリデーションを隠すこともできる

https://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html#:~:text=If%20confirmation%20validation,as%20an%20argument.

# 出典
https://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html#:~:text=password%2C%20validations%3A%20true)-,Link,-Adds%20methods%20to

# エラーメッセージが二回出力される
```rb
.
.
.
has_secure_password
  validates :password, presence: true,
                       length: { minimum: 6}                     
```
```
#<ActiveModel::Errors [#<ActiveModel::Error attribute=name, type=too_long, options={:count=>20}>, #<ActiveModel::Error attribute=email, type=blank, options={}>, #<ActiveModel::Error attribute=password, type=blank, options={}>, #<ActiveModel::Error attribute=password, type=blank, options={}>, #<ActiveModel::Error attribute=password, type=too_short, options={:count=>6}>]>
```
上のように
```#<ActiveModel::Error attribute=password, type=blank, options={}>, #<ActiveModel::Error attribute=password, type=blank, options={}>```

これは```has_secure_password```と```validates: password...```の2つあるためである。
実際これであっているかわからないが、
#### ```allow_nil: true```
:allow_nilオプションは、対象の値がnilの場合にバリデーションをスキップします。
##### 出典
https://railsguides.jp/active_record_validations.html#allow-nil:~:text=3.1-,%3Aallow_nil,%E5%80%A4%E3%81%8Cnil%E3%81%AE%E5%A0%B4%E5%90%88%E3%81%AB%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%82%B9%E3%82%AD%E3%83%83%E3%83%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%82,-class%20Coffee%20%3C

```rb
.
.
.
has_secure_password
  validates :password, presence: true,
                       length: { minimum: 6},
                       allow_nil: true                   
```
をつけることによって
```validates: password...```の部分のバリデーションでnilを許容することによってエラーメッセージを表示することを防ぐ。

# 感想
これが正しいかわからないので後で調べてください。
一応出典を書きました。