Rails: 覚書: has_secure_passwordのバリデーション
has_secure_password のバリデーションの覚書です。
参考: Rails: アカウント登録
2022/11/12 更新時にnilで保存できないようにしました。
Rails: 覚書: has_secure_passwordのバリデーション: 2
カスタムバリデーションの内容:
・モデルの生成時に、バリデーションを行う。
・passwordを変更しないモデルの更新時は、バリデーションを行わない。
・上記以外の更新時は、バリデーションを行う。
class Account < ApplicationRecord
# validates :email, presence: true
has_secure_password validations: false
validates :password, format: { with: /\A[a-z0-9]+\z/i }, length: { in: 8..30 }, on: :create
validates :password, format: { with: /\A[a-z0-9]+\z/i }, length: { in: 8..30 }, allow_nil: true, on: :update
end
標準の振る舞い
Account モデルの password に文字列を設定すると、password は 文字列、password_digest はハッシュ値が入ります。
モデルを保存しモデルを取得しなおすと password は nil、password_digest はハッシュ値が入ります。
password に空文字列("")を設定した場合は、password_digest は元の値から変更されません。例えば、パスワードを変更せずにフォームを送信した場合、引数 password の値は空文字列となるため、モデルを更新しても password_digest は更新されません。
今回の振る舞い
取得した password には nil が入っていますので、password を変更せずに保存してもバリデーションエラーが発生します。対策として独自のバリデーションで allow_nil: true とすることでバリデーションエラーを抑制できます。取得時の nil から変更していないので password_digest の値は変わりません。
尚、password に文字列ではなく nil を設定して更新すると、password_digest に nil が保存されます。これはトレードオフと考えています。
以上です。
この記事が気に入ったらサポートをしてみませんか?