Ruby on rails Rails-更新操作忽略验证

Ruby on rails Rails-更新操作忽略验证,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有一个应用程序,它有用于创建帐户的验证密码。但是,当用户更新密码时,它会忽略所有验证 用户控制器 class User < ActiveRecord::Base attr_accessible :email, :password, :password_confirmation, :name, attr_accessor :password before_save :encrypt_password before_save { |u

我有一个应用程序,它有用于创建帐户的验证密码。但是,当用户更新密码时,它会忽略所有验证

用户控制器

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

      attr_accessor :password
      before_save :encrypt_password
      before_save { |user| user.email = email.downcase }
      before_save { |user| user.name = name.downcase }
      before_create { generate_token(:auth_token) }
      before_create { generate_token(:email_token) }

      VALID_PASSWORD_REGEX = /^(?=.*[a-zA-Z])(?=.*[0-9]).{6,}$/
      validates_confirmation_of :password
      validates :password, :on => :create, presence: true, format: { with: VALID_PASSWORD_REGEX }
      validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
      validates :name, presence: true, format: { with: VALID_NAME_REGEX }, uniqueness: { case_sensitive: false }, length:  { minimum: 4 }

用:
:on=>[:创建,:更新]
试试看。但这意味着,在保存用户时,您需要输入密码并进行确认,因为它是以加密方式存储的,因此可能无法在用户实例中调用。(否则不安全。)

尝试使用:
:on=>[:创建,:更新]
。但这意味着,在保存用户时,您需要输入密码并进行确认,因为它是以加密方式存储的,因此可能无法在用户实例中调用。(否则就不安全了。)

试试这样的方法:

validates :password, :presence => {:on => :create}, :confirmation => true, format: { with: VALID_PASSWORD_REGEX }

我认为您编写它的方式只会在创建时执行整个操作,并完全排除更新

尝试以下操作:

validates :password, :presence => {:on => :create}, :confirmation => true, format: { with: VALID_PASSWORD_REGEX }

我认为您编写它的方式只是在创建时执行整个操作,并完全排除更新

假设加密密码属性名为
encrypted\u password

仅在需要密码设置时进行验证

validates :password, format: { with: VALID_PASSWORD_REGEX }, if: :password_required?

def password_required?
  encrypted_password.blank? || !password.blank?
end

假设加密密码属性名为
encrypted\u password

仅在需要密码设置时进行验证

validates :password, format: { with: VALID_PASSWORD_REGEX }, if: :password_required?

def password_required?
  encrypted_password.blank? || !password.blank?
end

该死的,我不能那样做。因为我有一个电子邮件激活令牌,当用户检查他们的电子邮件时激活,然后用户被保存。在那个页面上有密码和密码确认会很烦人。你们应该在密码上设置条件验证,以防密码并没有被更改。添加一个自定义验证器,它可以处理您需要的所有逻辑。该死的,我不能这样做。因为我有一个电子邮件激活令牌,当用户检查他们的电子邮件时激活,然后用户被保存。在那个页面上有密码和密码确认会很烦人。你们应该在密码上设置条件验证,以防密码并没有被更改。添加一个自定义验证器,它可以处理您需要的所有逻辑。是的,我尝试过,但当我创建一个用户并更改用户电子邮件激活令牌(这是注册的一部分)时,请致电@user.save!它告诉我验证是错误的(是的,我试过了,但当我创建一个用户并更改用户电子邮件激活令牌(这是注册的一部分)并调用@user.save时,它告诉我验证错误。:(它在保存之前有:加密密码,并且密码更改为仅2个字母时(这将破坏验证)它仍然被加密为lol so。问题仍然存在:(它在保存之前有:encrypt\u密码,而且当密码更改为仅2个字母时(这将破坏验证),它仍然被加密为lol so。问题仍然存在:(