Class: IpAddressValidator
- Inherits:
-
ActiveModel::EachValidator
- Object
- ActiveModel::EachValidator
- IpAddressValidator
- 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 |