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