Class: ActiveModel::Validations::UrlValidator

Inherits:
EachValidator
  • Object
show all
Defined in:
lib/validators/validates_url_format_of.rb

Constant Summary collapse

TLD_FILE_PATH =
File.expand_path('../../../data/tld.txt', __FILE__)

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.tldsObject



6
7
8
# File 'lib/validators/validates_url_format_of.rb', line 6

def self.tlds
  @tld ||= File.read(TLD_FILE_PATH).lines.map(&:chomp)
end

Instance Method Details

#url?(url) ⇒ Boolean

Returns:

  • (Boolean)


19
20
21
22
23
24
25
26
27
28
29
# File 'lib/validators/validates_url_format_of.rb', line 19

def url?(url)
  uri = URI(url)
  regex = options[:tld] ? Validators::URL_FORMAT_WITHOUT_TLD_VALIDATION :
                          Validators::URL_FORMAT

  uri.kind_of?(URI::HTTP) &&
  url.match(regex) &&
  valid_tld?(uri.host)
rescue URI::InvalidURIError
  false
end

#valid_tld?(host) ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
34
35
36
# File 'lib/validators/validates_url_format_of.rb', line 31

def valid_tld?(host)
  return true unless options[:tld]
  tld = host[/\.(.*?)$/, 1].to_s.downcase

  self.class.tlds.include?(tld)
end

#validate_each(record, attribute, value) ⇒ Object



10
11
12
13
14
15
16
17
# File 'lib/validators/validates_url_format_of.rb', line 10

def validate_each(record, attribute, value)
  return if url?(value.to_s)

  record.errors.add(attribute, :invalid_url,
    :message => options[:message],
    :value => value
  )
end