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)
にするとバリデーションを隠すこともできる
出典
エラーメッセージが二回出力される
.
.
.
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の場合にバリデーションをスキップします。
出典
.
.
.
has_secure_password
validates :password, presence: true,
length: { minimum: 6},
allow_nil: true
をつけることによって
validates: password...
の部分のバリデーションでnilを許容することによってエラーメッセージを表示することを防ぐ。
感想
これが正しいかわからないので後で調べてください。
一応出典を書きました。