Class: ActiveModel::Validations::EmailValidator

Inherits:
EachValidator
  • Object
show all
Defined in:
lib/active_validators/active_model/validations/email_validator.rb

Instance Method Summary collapse

Instance Method Details

#basic_check(mail) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/active_validators/active_model/validations/email_validator.rb', line 32

def basic_check(mail)
  # We must check that value contains a domain and that value is an email address
  valid = !!mail.domain

  if options[:only_address]
    # We need to dig into treetop
    # A valid domain must have dot_atom_text elements size > 1
    # user@localhost is excluded
    # treetop must respond to domain
    # We exclude valid email values like <[email protected]>
    # Hence we use m.__send__(tree).domain
    tree = mail.__send__(:tree)
    valid &&= (tree.domain.dot_atom_text.elements.size > 1)
  else
    valid &&= (mail.domain.split('.').length > 1)
  end
  valid
end

#check_validity!Object

Raises:

  • (ArgumentError)


10
11
12
# File 'lib/active_validators/active_model/validations/email_validator.rb', line 10

def check_validity!
  raise ArgumentError, "Not a callable object #{options[:with].inspect}" unless options[:with] == nil || options[:with].respond_to?(:call)
end

#validate_each(record, attribute, value) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/active_validators/active_model/validations/email_validator.rb', line 14

def validate_each(record, attribute, value)
  valid = begin
            mail = Mail::Address.new(value)

            basic_check(mail) && value.include?(mail.address)
          rescue Exception => _
            false
          end

  if options[:with]
    # technically the test suite will pass without the boolean coercion
    # but we know the code is safer with it in place
    valid &&= !!options[:with].call(mail)
  end

  record.errors.add attribute, (options.fetch(:message, :invalid)) unless valid
end