我的用户(设计)模型还有姓名,城市,国家,电话会员。
在创建注册页面中,我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
答案 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)