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? }