2

こんにちは、Railsアプリのリセットパスワードを作成しようとしています。しかし、保存しようとすると、次のエラーが発生します。

検証に失敗しました:パスワードを空白にすることはできません、パスワードが短すぎます(最小6文字)、パスワードの確認を空白にすることはできません

これが私のユーザーモデルです。

class User < ActiveRecord::Base
  attr_accessible :email, :password, :password_confirmation
  has_secure_password

  before_save { |user| user.email = email.downcase }
  before_save :create_remember_token

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
  validates :password, presence: true, length: { minimum: 6 }
  validates :password_confirmation, presence: true

    def send_password_reset
        self.password_reset_token = SecureRandom.urlsafe_base64
        self.password_reset_at = Time.zone.now
        self.password = self.password
        self.password_confirmation = self.password
        save!
    end

  private

    def create_remember_token
        self.remember_token = SecureRandom.urlsafe_base64
    end

end

メソッド「send_password_reset」はユーザーを更新せず、password_reset_tokenとpassword_reset_atだけを更新する代わりに、なぜユーザーを保存しようとしているのかわかりません。

誰か助けてくれませんか?

4

1 に答える 1

8

モデルインスタンスを呼び出すsave!と、モデルで検証が実行されますUser。それらのすべて。

パスワードの検証を条件付きでスキップする方法はいくつかあります。1つは使用することですProc

validates :password, presence: true, length: { minimum: 6 }, unless: Proc.new { |a| !a.new_record? && a.password.blank? }

これにより、インスタンスを保存できるようになり、フィールドが空白で、新しいものではない(データベースに既に保持されている)User場合、フィールドの検証がスキップされます。:passwordUser

これが私のアプリケーションで使用するパスワード検証のほとんどです

validates :password, confirmation: true,
                     length: {:within => 6..40},
                     format: {:with => /^(?=.*\d)(?=.*([a-z]|[A-Z]))([\x20-\x7E]){6,40}$/},

に個別の検証を行う必要はないことに注意してください:password_confirmation。代わりconfirmation: trueに、:passwordバリデーターに渡すだけです。

推奨読書:

于 2012-10-28T19:46:27.203 に答える