Ruby on Rails密码validation

所以我有一些有趣的密码validation要求:

  • 当用户注册时,我希望他们必须输入密码并确认并且在6..40之间(GOT THIS WORKING 100%)

  • 当用户更新其个人资料时,适用相同的validation规则(GOT THIS WORKING 100%)

  • 当管理员添加用户时,他们只需输入一次密码就应该validation(NOT WORKIG)

  • 当管理员编辑用户并且密码字段为空时,它不应更新密码,如果输入密码,则应validation密码。 (部分工作)

     validates :password, :presence => true, :confirmation => true, :length => {:within => 6..40}, :unless => :force_submit 

我无法覆盖的唯一情况是,当管理员添加用户时,它未经过validation,当管理员编辑用户(并输入密码)时,它不会被validation。

:force_submit是从admin表单传入的,因此不validation密码。 (所以更新空密码的情况有效)

任何想法/魔术?

以下似乎符合我的要求……我实际上现在要求所有用户确认..(它使视图更清洁)。 但是在更新中,我允许空白。

  validates :password, :presence => true, :confirmation => true, :length => {:within => 6..40}, :on => :create validates :password, :confirmation => true, :length => {:within => 6..40}, :allow_blank => true, :on => :update 

稍微根据接受的答案构建,这是我在Rails项目中使用的代码。 (注意:我们使用devise_invitable来处理用户身份validation,并使用devise_invitable来创建新用户。)

 PASSWORD_FORMAT = /\A (?=.{8,}) # Must contain 8 or more characters (?=.*\d) # Must contain a digit (?=.*[az]) # Must contain a lower case character (?=.*[AZ]) # Must contain an upper case character (?=.*[[:^alnum:]]) # Must contain a symbol /x validates :password, presence: true, length: { in: Devise.password_length }, format: { with: PASSWORD_FORMAT }, confirmation: true, on: :create validates :password, allow_nil: true, length: { in: Devise.password_length }, format: { with: PASSWORD_FORMAT }, confirmation: true, on: :update 

这适用于更新操作的空密码:

 validates :password, :presence => true, :on => :update, :if => lambda{ !password.nil? } validates :password, :confirmation => true, :length => { :minimum => 6}, :if => lambda{ new_record? || !password.nil? } 

又一个变种

 validates_presence_of :password_digest validates_length_of :password, minimum: 6, if: Proc.new { |user| user.password.present? }