I have two classes responsible for attributes validation:
class NameValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
message = options.fetch(:message, I18n.t('errors.attributes.name.invalid'))
record.errors[attribute] << message unless NameValidator.valid_name?(value)
end
def self.valid_name?(name)
name =~ /\A[a-z][\w\p{Blank}]+\z/i
end
end
and the second one:
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
message = options.fetch(:message, I18n.t('errors.attributes.email.invalid'))
record.errors[attribute] << message unless EmailValidator.valid_email?(value)
end
def self.valid_email?(email)
email =~ /\A.+@.+\..+\z/i
end
end
They're basically the same. Should I inherit them from one class with protected utility methods or what?
1 Answer 1
By creating a base class and then inheriting from it, you end up with no duplication and with an architecture that can be easily extended.
I don't think that you should bother having valid?
as protected
. Calling valid?
from outside is a common use case and doesn't violate encapsulation.
class Validator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
message = options.fetch(:message, I18n.t('errors.attributes.name.invalid'))
record.errors[attribute] << message unless self.valid?(value)
end
def self.valid?(value)
raise NotImplementedError
end
end
class NameValidator < Validator
def self.valid?(value)
value =~ /\A[a-z][\w\p{Blank}]+\z/i
end
end
class EmailValidator < Validator
def self.valid?(value)
value =~ /\A.+@.+\..+\z/i
end
end
-
1\$\begingroup\$ Welcome to Code Review! Good job on your first answer \$\endgroup\$SirPython– SirPython2016年01月25日 23:35:08 +00:00Commented Jan 25, 2016 at 23:35
-
\$\begingroup\$ The other reason to keep valid? public is that you can unit test it. \$\endgroup\$Thomas Andrews– Thomas Andrews2016年01月28日 05:04:25 +00:00Commented Jan 28, 2016 at 5:04
Explore related questions
See similar questions with these tags.
validates_format_of
instead? \$\endgroup\$