在密码重置期间,在Devise模型中跳过某些成员的验证

时间:2012-02-05 21:36:23

标签: ruby-on-rails validation devise

我的用户(设计)模型还有姓名,城市,国家,电话会员。

在创建注册页面中,我validates_presence_of city, nation, phone, name, email, :on => :create

在修改注册页面中,我validates_presence_of city, nation, phone, name, :on => :update

现在,当我在forgot_password_page上设置新密码时,它会询问Devise::PasswordsController#update

中是否存在城市,国家,电话,姓名

如何处理选择性验证?

我猜它应该是这样的,

validates_presence_of city, nation, phone, name, :on => :update, :if => :not_recovering_password

def not_recovering_password
  # what goes here
end

4 个答案:

答案 0 :(得分:10)

我遇到了类似的问题,因为创建用户时并非所有字段都是必需的。其他领域'使用验证检查在线状态on: :update

所以这就是我解决的问题:

validates :birthdate, presence: true, on: :update, unless: Proc.new{|u| u.encrypted_password_changed? }

方法encrypted_password_changed?Devise Recoverable中使用的方法。

答案 1 :(得分:3)

我遇到了这个问题寻找类似问题的答案,所以希望其他人发现这个有用。就我而言,我正在处理遗留数据,这些数据缺少以前不需要但以后需要的字段的信息。以下是我完成上述代码所做的工作:


validates_presence_of city, nation, phone, name, :on => :update, :if => :not_recovering_password

def not_recovering_password
  password_confirmation.nil?
end

基本上,它使用password_confirmation字段的缺席/存在来了解用户是否正在尝试更改/重置其密码。如果它没有填充,它们不会改变它(因此,运行您的验证)。如果它已填满,那么它们正在更改/重置,因此,您希望跳过验证。

答案 2 :(得分:2)

在Devise模型中,您可以覆盖BOOL并使用自己的验证。例如:

reset_password!

答案 3 :(得分:1)