用户电子邮件的Rails验证 - 仅希望它在用户注册或更新电子邮件地址时进行验证

rob*_*sco 15 validation ruby-on-rails models

我有一个用户模型,通常的属性,如电子邮件和hashed_pa​​ssword等.我想写一个验证,检查是否存在电子邮件地址,但仅限于

1)数据库中没有存储该对象(即这是一个新用户注册)

2)用户正在尝试更新他们的电子邮件地址.

我目前的验证

  validates_presence_of :email
  validates_presence_of :email_confirmation

  validates_confirmation_of :email
Run Code Online (Sandbox Code Playgroud)

显然阻止我更新任何属性.我想过要用

validates_presence_of:email,:if:email_validation_required?

def email_validation_required?
self.email.blank?
end
Run Code Online (Sandbox Code Playgroud)

但是这对情节2没有帮助,因为它会返回true,因为用户在数据库中确实有一个密码电子邮件地址.

我无法弄清楚如何将其限制在上述两种情况中.

有人可以帮忙吗?

Bar*_*ess 22

我认为EmFi正在做点什么.但我不认为validates_presence_of :email应该阻止你.该email应始终存在-如果在表单留空参数不会惹你节省用户的.如果它在表单中输入,即使是更新,它也应该有一个email_confirmation沿途.

尝试一下:

validates_presence_of :email
validates_presence_of :email_confirmation, :if => :email_changed?

validates_confirmation_of :email
Run Code Online (Sandbox Code Playgroud)


Mat*_*ggs 10

你有两个选择.一个是用:on.默认情况下,它们设置为:on => :save,但您可以执行此类操作

validates_presence_of :email, :on => :create
Run Code Online (Sandbox Code Playgroud)

要么

validates_presence_of :email, :on => :update
Run Code Online (Sandbox Code Playgroud)

其他选项是使用:if,然后传入方法名称或proc.所以像

validates_presence_of :email, :if => :should_validate
Run Code Online (Sandbox Code Playgroud)

要么

validates_presence_of :email, :if => Proc.new { |user| user.signup_stage > 2 }
Run Code Online (Sandbox Code Playgroud)

希望有帮助:)


EmF*_*mFi 5

您想在使用ActiveRecord :: Dirty方法的验证上使用:if子句:

validates_presence_of :email, :if => Proc.new { |user| user.email_changed?}
Run Code Online (Sandbox Code Playgroud)

NB仅适用于Rails 2.1或更高版本.