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 |