QA@IT

Railsのhas_secure_passwordのバリデーションをスキップするには?

3729 PV

Railsのhas_secure_passwordを使うと、password_digest に validates_presence_of がかけられるのですが、
このバリデーションをスキップするには、どうすればいいのでしょうか?

回答

savevalidate: false を渡すことで validation をスキップできます。

u = User.new(...)
u.save validate: false

password_digest 以外に対する validation もスキップされてしまうので、データの不整合が発生しないよう十分に注意してください。あらかじめ適当なパスワードを設定して valid? かどうかを確かめるといいかもしれません。

u = User.new(...)
u.password_digest = 'DUMMY'

if u.valid?
  u.password_digest = nil
  u.save validate: false
end
編集 履歴 (0)
  • なるほど。すべての validation がスキップされてしまうというのが不安だったのですが、valid? で確かめることができますね。ありがとうございます。 -

(他の人の回答がさっぱり内容だったら従ってください。Acceptする前に他の人の意見を聞くといいと思います)

バリデーションをスキップしたいということは、すくなくとも有意な値をセットしたいわけではないのかと思います。ですから、下記のようにダミーデータを入れて、「パスワードを使っていないユーザ」ということにするのはいかがでしょうか。

class User < ActiveRecord::Base
  DUMMY_PASSWPORD = '\(^o^)/'
  before_validation :set_dummy_password, if: :password_login_disabled?

  def password_login_disabled?
     (パスワードが不要になる条件) || \
     password_digest == DUMMY_PASSWORD
  end

  private

  def set_dummy_password
     self.password_digest = DUMMY_PASSWORD
  end
end
編集 履歴 (1)
  • ありがとうございます。確かにこの方法で出来そうです。参考にさせていただきます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。