Rails Validation для электронной почты пользователей - только хотите, чтобы она проверяла, когда пользователь подписывает или обновляет адрес электронной почты

У меня есть модель User с обычными атрибутами, такими как электронная почта и hashed_password и т.д. Я хочу написать проверку, которая проверяет наличие адреса электронной почты, но только когда

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, потому что у пользователя есть адрес password в db.

Я не могу разобраться, как я могу ограничить его только этими двумя сценариями выше.

Может ли кто-нибудь помочь?

Ответ 1

Я думаю, что EmFi что-то происходит. Но я не думаю, что validates_presence_of :email должен держать вас. email всегда должен присутствовать - если он оставлен пустым в форме, параметр не испортит ваше сохранение пользователя. Если он вводится в форму, даже для обновления, он должен иметь email_confirmation для езды.

Попробуйте:

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

validates_confirmation_of :email

Ответ 2

у вас есть два варианта. один - использовать :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 }

Надеюсь, что помогает:)

Ответ 3

Вы хотите использовать предложение if: при проверке, использующей методы ActiveRecord:: Dirty:

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

N.B. Работает только в Rails 2.1 или новее.