Class: IpAddressValidator

Inherits:
ActiveModel::EachValidator
  • Object
show all
Defined in:
app/validators/ip_address_validator.rb

Overview

IpAddressValidator

Validates that an IP address is a valid IPv4 or IPv6 address. This should be coupled with a database column of type inet

When using column type inet Rails will silently return the value as nil when the value is not valid according to its type cast using IpAddr. It’s not very user friendly to return an error “IP Address can’t be blank” when a value was clearly given but was not the right format. This validator will look at the value before Rails type casts it when the value itself is nil. This enables the validator to return a specific and useful error message.

This validator allows nil values by default since the database allows null values by default. To disallow nil values, use in conjunction with ‘presence: true`.

Do not use this validator with ‘allow_nil: true` or `allow_blank: true`. Because of Rails type casting, when an invalid value is set the attribute will return nil and Rails won’t run this validator.

Example:

class Group < ActiveRecord::Base
  validates :ip_address, presence: true, ip_address: true
end

Instance Method Summary collapse

Instance Method Details

#validate_each(record, attribute, _) ⇒ Object



31
32
33
34
35
36
37
38
# File 'app/validators/ip_address_validator.rb', line 31

def validate_each(record, attribute, _)
  value = record.public_send("#{attribute}_before_type_cast") # rubocop:disable GitlabSecurity/PublicSend
  return if value.blank?

  IPAddress.parse(value.to_s)
rescue ArgumentError
  record.errors.add(attribute, _('must be a valid IPv4 or IPv6 address'))
end