在特定情况下禁用验证

时间:2014-05-04 18:47:21

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

在我的User模型中,我为密码及其确认设置了验证:

validates_presence_of :password, :password_confirmation

我用它来表格。这些属性不存储在数据库中,我使用的是authlogic gem。

现在我正在尝试建立一个系统来通过电子邮件恢复忘记的密码。用户输入他的电子邮件,并按如下方式检索对象:

@user = User.find_by_email(params[:email])

然后,在该过程的某个时刻,User属性的值设置为true,意味着用户忘记了密码,因此我需要执行@user.save

问题出在那里。由于永远不存储passwordpassword_confirmation,因此其值为nil。但是,验证会发挥作用并阻止用户更新。

有没有办法跳过这些特定的验证,这样我才能做到这一点?或者我应该做些什么?有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

您可以使用save(validate: false)跳过所有验证。例如,您可以使用:if:unless选项跳过单独的验证。

validates_presence_of :password, :password_confirmation, unless: :forgot_password?

def forgot_password?
  # return true if the user is in the forgot password process
end

答案 1 :(得分:1)

更改

validates_presence_of :password, :password_confirmation

假设您设置为true的字段为forgot_password

validates_presence_of :password, :password_confirmation, :unless =>  Proc.new { |a| a.forgot_password? }

条件验证documentation