Подтвердить что ты не робот

Проверять формат электронной почты только в том случае, если не пустой Rails 3

Я хочу проверить электронную почту только в том случае, если письмо было введено.

Я попробовал следующее:

validates :email, :presence => {:message => "Your email is used to save your greeting."},
                  :email => true,
                  :if => Proc.new {|c| not c.email.blank?},
                  :uniqueness => { :case_sensitive => false }

Однако это не работает, так как оно не позволяет сообщениям об ошибках показывать, когда электронное письмо остается пустым.

Как я могу проверить наличие электронной почты, когда она отсутствует, и ТОЛЬКО проверять формат, когда он был введен?

4b9b3361

Ответ 1

Это должно сделать трюк.

validates :email,:presence => {:message => "Your email is used to save your greeting."}, :allow_blank => true,:uniqueness => { :case_sensitive => false } 

Используйте :allow_blank => true или :allow_nil => true, :if => :email?

Изменить: установить опечатку.

Ответ 2

Вы можете написать специальную функцию проверки:

class Model < ActiveRecord::Base
  validate :check_email

  protected
  def check_email
    if email.blank?
      validates :email, :presence => {:message => "Your email is used to save your greeting."}
    else
      validates :email,
        :email => true,
        :uniqueness => { :case_sensitive => false }      
    end
  end
end

или разделите валидатор на два отдельных валидатора с условиями:

validates :email, 
  :presence => {:message => "Your email is used to save your greeting."}, 
  :if => Proc.new {|c| c.email.blank?}

validates :email, 
  :email => true,
  :uniqueness => { :case_sensitive => false }
  :unless => Proc.new {|c| c.email.blank?}

Ответ 3

вы можете проверить формат, если не требуется : allow_nil = > true