Rails模型验证更新

时间:2015-02-19 09:09:39

标签: ruby-on-rails ruby-on-rails-4

我无法弄清楚为什么我的模型没有按照我的意愿行事。

 class User < ActiveRecord::Base
    has_secure_password
    validates :first_name, :last_name, 
               presence:true, 
               length: { maximum: 30 }
    validates :username, 
              presence:true, 
              uniqueness:true, 
              length: { maximum: 30 }
    validates :password, 
               presence:true, 
               confirmation: true, 
               length: { :minimum => 6}, 
               unless: lambda{ persisted? and password.nil? }
    validates :password_confirmation, 
               presence: true, 
               unless: lambda{ persisted? and password.nil? }
    validates :email, 
               format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }, 
               uniqueness: true, 
               allow_blank: true
 end

正如您所看到的,代码非常简单。

要获得password_digest字段,我需要'password'和'password_confirmation'。

在创建模式下,一切都很好。 在更新模式下无法正常工作。

我想检查验证密码并检查它们是否始终匹配,除非用户已存在且“密码”字段为空。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我会尝试一个更简单的逻辑:

validates :password, 
          presence:true, 
          confirmation: true, 
          length: { :minimum => 6}, 
          unless: :persisted?

validates :password_confirmation, 
          presence: true, 
          if: lambda{ password.present? }

对于新的User

  • 如果password为空,则会在password
  • 上收到错误消息
  • 如果password存在且password_confirmation为空,则password_confirmation
  • 会出错

对于现有的User

  • 如果password为空白,则不会发生任何事情
  • 如果password存在且password_confirmation为空,则password_confirmation
  • 会出错