class ActiveModel::Validations::EmailValidator

Constants

EMAIL_REGEXP
FINAL_LABEL_REGEXP
LABEL_REGEXP
SEGMENT_REGEXP

Public Instance Methods

email_valid?(value) click to toggle source
# File lib/can_has_validations/validators/email_validator.rb, line 20
def email_valid?(value)
  return unless value
  recipient, domain = value.split('@', 2)
  is_valid = true

  recipient ||= ''
  is_valid &&= recipient.length <= 255
  is_valid &&= recipient !~ /\.\./
  is_valid &&= !recipient.starts_with?('.') 
  is_valid &&= !recipient.ends_with?('.') 
  recipient.split('.').each do |segment|
    is_valid &&= segment =~ SEGMENT_REGEXP
  end

  domain ||= ''
  if defined?(Addressable::IDNA)
    domain &&= Addressable::IDNA.to_ascii(domain)
  end
  labels = domain.split('.')
  is_valid &&= domain.length <= 255
  is_valid &&= domain !~ /\.\./
  is_valid &&= labels.size.in? 2..100
  labels.each_with_index do |label, idx|
    is_valid &&= label.length <= 63
    if idx+1==labels.size
      is_valid &&= label =~ FINAL_LABEL_REGEXP
    else
      is_valid &&= label =~ LABEL_REGEXP
    end
  end

  is_valid
end
validate_each(record, attribute, value) click to toggle source
# File lib/can_has_validations/validators/email_validator.rb, line 14
def validate_each(record, attribute, value)
  unless email_valid?(value)
    record.errors.add(attribute, :invalid_email, **options.merge(value: value))
  end
end