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 или новее.