require 'validates_as_email_address/rfc_822' require 'validates_as_email_address/rfc_1035' # Adds validations for email addresses module ValidatesAsEmailAddress # Validates whether the value of the specific attribute matches against the # RFC822/RFC1035 specification. # # class Person < ActiveRecord::Base # validates_as_email_address :email, :on => :create # end # # This will also validate that the email address is within the specification # limits, i.e. between 3 and 320 characters in length. # # Configuration options for length: # * +minimum+ - The minimum size of the attribute # * +maximum+ - The maximum size of the attribute # * +is+ - The exact size of the attribute # * +within+ - A range specifying the minimum and maximum size of the attribute # * +in+ - A synonym(or alias) for :within # * +too_long+ - The error message if the attribute goes over the maximum (default is: "is too long (maximum is %d characters)") # * +too_short+ - The error message if the attribute goes under the minimum (default is: "is too short (minimum is %d characters)") # * +wrong_length+ - The error message if using the :is method and the attribute is the wrong size (default is: "is the wrong length (should be %d characters)") # # Configuration options for format: # * +wrong_format+ - A custom error message (default is: "is an invalid email address") # # Miscellaneous configuration options: # * +allow_nil+ - Attribute may be nil; skip validation. # * +on+ - Specifies when this validation is active (default is :save, other options :create, :update) # * +if+ - Specifies a method, proc or string to call to determine if the validation should # occur (e.g. :if => :allow_validation, or :if => lambda { |user| user.signup_step > 2 }). The # method, proc or string should return or evaluate to a true or false value. # * +strict+ - Specifies if the domain part of the email should be compliant to RFC 1035 (default is true). If set to false domains such as '-online.com', '[127.0.0.1]' become valid. def validates_as_email_address(*attr_names) configuration = attr_names.last.is_a?(Hash) ? attr_names.pop : {} configuration.reverse_merge!( :wrong_format => ActiveRecord::Errors.default_error_messages[:invalid_email], :strict => true ) # Add format validation format_configuration = configuration.dup format_configuration[:message] = configuration.delete(:wrong_format) format_configuration[:with] = configuration[:strict] ? RFC1035::EmailAddress : RFC822::EmailAddress validates_format_of attr_names, format_configuration # Add length validation length_configuration = configuration.dup length_configuration.reverse_merge!(:within => 3..320) unless ([:minimum, :maximum, :is, :within, :in] & configuration.keys).any? validates_length_of attr_names, length_configuration end end ActiveRecord::Base.class_eval do extend ValidatesAsEmailAddress end # Add error messages specific to this validation ActiveRecord::Errors.default_error_messages.update( :invalid_email => 'is an invalid email address' )