Rails3 + Devise:更新时阻止密码验证

Ian*_*res 6 devise ruby-on-rails-3

我正在寻找一种方法来允许用户更改他们的设置(用户模型)而无需更改他们的密码(他们仍然必须输入他们当前的密码).开箱即用似乎允许这样做,但是当您删除可验证模块并设置自定义验证时,您似乎需要稍微解决一下.

我在我的用户模型中设置了以下验证:

validates :password, length: { in: 6..128 }
Run Code Online (Sandbox Code Playgroud)

注册时,用户需要指定他的密码(这是我所期望的).但是,在更新设置时,如果我将密码留空,则会向用户发出一个错误,即密码必须至少为6个字符.

如何在不改变Devise工作方式或必须实现某种自定义控制器的情况下解决这个问题?

Ian*_*res 13

也许这对某些人来说看起来很明显,但我花了一段时间才把它们放在一起.经过几个小时的尝试不同的解决方案和解决方法,并查看了整个地方,我深入研究了Rails验证,并找到了一些结构,当它们放在一起时,使这很容易.

我所要做的就是为创建操作设置验证,为更新操作设置一个验证,并允许更新空白.

  validates :password, length: { in: 6..128 }, on: :create
  validates :password, length: { in: 6..128 }, on: :update, allow_blank: true
Run Code Online (Sandbox Code Playgroud)

有了这个,我得到了我想要的行为,而且只有两行简短的代码.

附加说明:

起初,我尝试过这种方式:

validates :password, length: { in: 6..128 }, on: :create
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为它会在更新时完全跳过验证.然后,用户可以在更新设置时设置短/长(或空白?)密码.


Ama*_*r S 6

将此代码添加到您的用户模型中.

private
def password_required?
  new_record? ? super : false
end  
Run Code Online (Sandbox Code Playgroud)


Sun*_*dan 6

我尝试了Amal Kumar S解决方案,但不幸的是它没有帮我解决同样的问题,所以这里是在实际项目中测试的解决方案的修改版本.

以下是devise/models/validatable.rb模块的代码

protected

# Checks whether a password is needed or not. For validations only.
# Passwords are always required if it's a new record, or if the password
# or confirmation are being set somewhere.
def password_required?
  !persisted? || !password.nil? || !password_confirmation.nil?
end
Run Code Online (Sandbox Code Playgroud)

在更新用户信息时留下空白密码和密码确认字段时验证失败,因为此条件始终为false:

!password.nil? || !password_confirmation.nil? 
Run Code Online (Sandbox Code Playgroud)

密码和密码_确认字段等于空字符串'',它永远不等于nil.所以你可以通过覆盖password_required来解决这个问题?您的用户模型中的方法并更改为nil?检查空白?校验.

protected

def password_required?
 !persisted? || !password.blank? || !password_confirmation.blank?
end
Run Code Online (Sandbox Code Playgroud)

认为这是解决这个问题的最简单方法,并不会破坏原始逻辑.也许这是设计的错误.