Проверка 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 или более поздней версии.