So, we wanted to check that a user could enter both "20" and "20%" and "20.000%" and have them all perfectly valid for a field on our models. I finished up with this validation method (below) to add to ActiveRecord::Base.
# validates whether the given object is a percentage
# Can also take optional args which will get passed verbatim into the
# "validates inclusion" method.
# It will safely take the usual set of fields for that - but if you pass
# in a new message - it will get used for both validations.
# The default message is: "should be a percentage (0-100)"
def self.validates_percentage(fields, args = {})
msg = args[:message] || "should be a percentage (0-100)"
validates_each fields do |model, attr, val|
pre_val = model.send("#{attr}_before_type_cast".to_sym)
unless val.nil? || !pre_val.is_a?(String) || pre_val =~ /^[-+]?\d+(\.\d*)?%?$/
model.errors.add(attr, msg)
end
end
args[:message] = msg
args[:in] = 0..100
validates_inclusion_of fields, args
end
No comments:
Post a Comment