生成重置密码令牌不保存在模型上

时间:2012-10-28 19:40:09

标签: ruby-on-rails ruby ruby-on-rails-3.2 railscasts

您好我尝试为我的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。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:8)

当您在模型实例上调用save!时,它将在您的User模型上运行验证;所有这些。

有许多方法可以有条件地跳过密码验证。一种是使用Proc

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

这将允许保存User个实例,如果:password字段为空,且User不是新的,则会跳过validates :password, confirmation: true, length: {:within => 6..40}, format: {:with => /^(?=.*\d)(?=.*([a-z]|[A-Z]))([\x20-\x7E]){6,40}$/}, 字段的验证(已经保留到数据库)

以下是我在我的应用程序中使用的大部分密码验证

:password_confirmation

请注意,您不需要confirmation: true上的单独验证。相反,只需将:password传递给{{1}}验证程序。

建议阅读: