I’m working on adhering to the HTML 5 standard for things whenever possible in Flagship Geo. While I haven’t gone all-out just yet and completely standardized things, I recently spent a few minutes working on code to help validate colors.
If you had asked me over the weekend if I care a lot about web-colors I would have said no, but then I discovered a bunch of stuff in the HTML 5 about colors. There is a special “color” input box (not yet implemented anywhere) which is suppose to help people select colors and there is a pretty thorough section on how to validate what belongs in an official color box.
Since validators in Rails 3 are much more straightforward to implement, I took a few minutes to toss one together that validates simple color strings, i.e those hexadecimal strings that start with a pound sign. If you’re looking to do something like this in your application, here’s how:
lib/hex_color_validator.rb
# Validates a hexadecimal color string as defined in the HTML 5 spec.
# This validator only works for the simple case and does not support
# any legacy formats. See http://dev.w3.org/html5/spec/Overview.html#valid-simple-color
# for the format spec.
class HexColorValidator < ActiveModel::EachValidator
# Verifies a color string is 7 characters long and contains
# only hex values after the pound sign.
def validate_each(object, attribute, value)
unless value =~ /^#[0-9a-fA-F]{6}$/
object.errors[attribute] << (options[:message] || " is not a properly formatted color string")
end
end
end
… paired with …
app/model/layer.rb
class Layer < ActiveRecord::Base
# Validations
validates :color, :hex_color => true
end
In my example, I’m validating the color attribute that exists on the Layer model. You can view the commit on GitHub if you’d like.