我有一个用户模型,与通常的属性(如电子邮件和hashed_password等。我想写一个验证,检查是否存在一个电子邮件地址,但只有当

1)没有一个存储在数据库,用于这个目的(即这是一个新的用户签名)

2)用户是试图更新其电子邮件地址。

我目前验证

  validates_presence_of :email
  validates_presence_of :email_confirmation

  validates_confirmation_of :email

显然是阻止我的任何更新的属性。我以为使用

validates_presence_of电子邮件:如果:email_validation_required?

def email_validation_required?
self.email.blank?
end

但是,这不会帮助方案2,因为它将返回正确的,因为用户不会有 密码 电子邮件地址的数据库。

我不能工作了,我怎么能限制它仅仅是这些方案2上。

任何人都可以帮忙吗?

有帮助吗?

解决方案

我认为EmFi是对的东西。但我不认为 validates_presence_of :email 应该保持你。的 email 应始终是本-如果它是空的形成的参数不会惹你保存的用户。如果是进入形式,即使对于更新时,它应该有一个 email_confirmation 沿。

试试这个:

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

validates_confirmation_of :email

其他提示

你有两个选择。一种是使用 :on.默认情况下,他们被设定为 :on => :save, 但是你可以做像这样的东西这个

validates_presence_of :email, :on => :create

validates_presence_of :email, :on => :update

其他的选择是使用 :if, ,然后通过在一个方法名称或proc.如此喜欢的东西

validates_presence_of :email, :if => :should_validate

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

希望有助于:)

你想使用:如果条款在有效使用Email::肮脏的方法:

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

N.B。只能在轨2.1或以后。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top