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 が保存されます。これはトレードオフと考えています。

以上です。

この記事が気に入ったらサポートをしてみませんか?