15

我有一个具有常用属性的用户模型,例如 email 和 hashed_pa​​ssword 等。我想编写一个验证来检查电子邮件地址的存在,但只有在

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

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

我目前的验证

  validates_presence_of :email
  validates_presence_of :email_confirmation

  validates_confirmation_of :email

显然阻止我更新任何属性。我想过使用

validates_presence_of :email , :if :email_validation_required?

def email_validation_required?
self.email.blank?
end

但这对场景 2 没有帮助,因为它将返回 true,因为用户在数据库中确实有密码电子邮件地址。

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

任何人都可以帮忙吗?

4

3 回答 3

24

我认为 EmFi 正在做某事。但我不认为validates_presence_of :email应该阻止你。应该始终存在 - 如果在表单中将其email留空,则该参数不会影响您保存的用户。如果它在表格中输入,即使是为了更新,它也应该有一个email_confirmation顺风顺水。

试试这个:

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

validates_confirmation_of :email
于 2009-11-05T15:00:41.620 回答
10

你有两个选择。一是使用:on。默认情况下,它们设置为:on => :save,但你可以这样做

validates_presence_of :email, :on => :create

或者

validates_presence_of :email, :on => :update

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

validates_presence_of :email, :if => :should_validate

或者

validates_presence_of :email, :if => Proc.new { |user| user.signup_stage > 2 }

希望有帮助:)

于 2009-11-04T13:51:49.613 回答
5

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

validates_presence_of :email, :if => Proc.new { |user| user.email_changed?}

注意 仅适用于 Rails 2.1 或更高版本。

于 2009-11-04T15:44:16.867 回答