Ruby on rails 3 铁路3&x2B;设计:在更新时防止密码验证

Ruby on rails 3 铁路3&x2B;设计:在更新时防止密码验证,ruby-on-rails-3,devise,Ruby On Rails 3,Devise,我一直在寻找一种方法,允许用户更改他们的设置(用户模型),而不必更改密码(他们仍然需要输入当前密码)。开箱即用的设计似乎允许这样做,但当您删除可验证模块并设置自定义验证时,您似乎需要稍微解决一下 我已在我的用户模型中设置了以下验证: validates :password, length: { in: 6..128 } 在注册时,用户需要指定他的密码(这是我所期望的)。不过,在更新设置时,如果我将密码留空,则会向用户提示一个错误,即密码必须至少为6个字符 我怎样才能在不改变Desive工作方式

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

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

validates :password, length: { in: 6..128 }
在注册时,用户需要指定他的密码(这是我所期望的)。不过,在更新设置时,如果我将密码留空,则会向用户提示一个错误,即密码必须至少为6个字符


我怎样才能在不改变Desive工作方式或实现某种自定义控制器的情况下解决这个问题?

也许这对某些人来说是显而易见的,但我花了一段时间才把它整理好。在尝试了几个小时不同的解决方案和解决方法并四处查看之后,我深入研究了Rails验证,发现了一些结构,当它们组合在一起时,使这变得非常简单

我所要做的就是为create操作设置一个验证,为update操作设置一个验证,并在更新时允许空白

  validates :password, length: { in: 6..128 }, on: :create
  validates :password, length: { in: 6..128 }, on: :update, allow_blank: true
有了它,我得到了我想要的行为,它只是两行短代码

附加说明:

起初,我试过这样做:

validates :password, length: { in: 6..128 }, on: :create

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

Desive有自己的方法来实现这一点,它更新记录属性而无需请求当前密码。决不允许更改当前密码

注意。如果您使用此方法,您可能应该覆盖此方法以保护您不希望在没有密码的情况下更新的其他属性

例如:

def update_而不使用_密码(params={})
参数删除(:电子邮件)
超级(参数)
终止

这些都在设计文档中

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

private
def password_required?
  new_record? ? super : false
end  

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

下面是designe/models/validable.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
更新用户信息时,如果将密码和密码确认字段保留为空,验证将失败,因为此条件始终为false:

!password.nil? || !password_confirmation.nil? 
Password和Password_confirmation字段等于空白字符串“”,该字符串从不等于nil。所以你可以通过覆盖密码来解决这个问题?方法,并将其更改为零?支票空白?检查

protected

def password_required?
 !persisted? || !password.blank? || !password_confirmation.blank?
end

认为这是解决这个问题的最简单方法,而且不会破坏原始逻辑。可能是Desive的bug。

我可以用它来处理我的用例,从控制台添加用户时跳过了密码要求(因为我使用的是Desive_不可修改模块)。我必须改变
!持久化?
持久化?
来实现这一点。