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

у меня есть модель пользователя с обычными атрибутами, такими как электронная почта и 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, потому что у пользователя есть пароль адрес электронной почты в БД.

Я не могу понять, как я могу ограничить его только те 2 выше сценариев.

кто может помочь?

3 ответов


Я думаю, что EmFi на что-то. Но я не думаю, что validates_presence_of :email должно вас задерживать. The 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 }

надеюсь, что это поможет:)


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

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

N. B. работает только в Rails 2.1 или более поздней версии.