0
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 1 year has passed since last update.

has_secure_passwordとは

Last updated at Posted at 2023-01-12

has_secure_passwordは検証もしている。

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 のチェックをしません。

出典

と書いてあった。
has_secure_passwordもバリデーションをしていることに気づいた。

後にしてみた。

.
.
.
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)でないこと

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

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

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

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

出典

エラーメッセージが二回出力される

.
.
.
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_passwordvalidates: password...の2つあるためである。
実際これであっているかわからないが、

allow_nil: true

:allow_nilオプションは、対象の値がnilの場合にバリデーションをスキップします。

出典

.
.
.
has_secure_password
  validates :password, presence: true,
                       length: { minimum: 6},
                       allow_nil: true                   

をつけることによって
validates: password...の部分のバリデーションでnilを許容することによってエラーメッセージを表示することを防ぐ。

感想

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

0
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
0
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?