lib/validatable_class_methods.rb in validatable-1.4.0 vs lib/validatable_class_methods.rb in validatable-1.5.0

- old
+ new

@@ -1,203 +1,9 @@ module Validatable - module ClassMethods - # call-seq: validates_format_of(*args) - # - # Validates whether the value of the specified attribute is of the correct form by matching it against the regular expression provided. - # - # class Person - # include Validatable - # validates_format_of :first_name, :with => /[ A-Za-z]/ - # end - # - # A regular expression must be provided or else an exception will be raised. - # - # Configuration options: - # - # * message - The message to add to the errors collection when the validation fails - # * times - The number of times the validation applies - # * level - The level at which the validation should occur - # * if - A block that when executed must return true of the validation will not occur - # * with - The regular expression used to validate the format - # * group - The group that this validation belongs to. A validation can belong to multiple groups - def validates_format_of(*args) - add_validations(args, ValidatesFormatOf) - end + module ClassMethods #:nodoc: - # call-seq: validates_length_of(*args) - # - # Validates that the specified attribute matches the length restrictions supplied. - # - # class Person - # include Validatable - # validates_length_of :first_name, :maximum=>30 - # validates_length_of :last_name, :minimum=>30 - # end - # - # Configuration options: - # - # * message - The message to add to the errors collection when the validation fails - # * times - The number of times the validation applies - # * level - The level at which the validation should occur - # * if - A block that when executed must return true of the validation will not occur - # * minimum - The minimum size of the attribute - # * maximum - The maximum size of the attribute - # * is - The size the attribute must be - # * within - A range that the size of the attribute must fall within - # * group - The group that this validation belongs to. A validation can belong to multiple groups - def validates_length_of(*args) - add_validations(args, ValidatesLengthOf) - end - - # call-seq: validates_numericality_of(*args) - # - # Validates that the specified attribute is numeric. - # - # class Person - # include Validatable - # validates_numericality_of :age - # end - # - # Configuration options: - # - # * message - The message to add to the errors collection when the validation fails - # * times - The number of times the validation applies - # * level - The level at which the validation should occur - # * if - A block that when executed must return true of the validation will not occur - # * group - The group that this validation belongs to. A validation can belong to multiple groups - # * only_integer - Whether the attribute must be an integer (default is false) - def validates_numericality_of(*args) - add_validations(args, ValidatesNumericalityOf) - end - - # call-seq: validates_acceptance_of(*args) - # - # Encapsulates the pattern of wanting to validate the acceptance of a terms of service check box (or similar agreement). Example: - # - # class Person - # include Validatable - # validates_acceptance_of :terms_of_service - # validates_acceptance_of :eula, :message => "must be abided" - # end - # - # Configuration options: - # - # * message - The message to add to the errors collection when the validation fails - # * times - The number of times the validation applies - # * level - The level at which the validation should occur - # * if - A block that when executed must return true of the validation will not occur - # * group - The group that this validation belongs to. A validation can belong to multiple groups - def validates_acceptance_of(*args) - add_validations(args, ValidatesAcceptanceOf) - end - - # call-seq: validates_confirmation_of(*args) - # - # Encapsulates the pattern of wanting to validate a password or email address field with a confirmation. Example: - # - # Class: - # class PersonPresenter - # include Validatable - # validates_confirmation_of :user_name, :password - # validates_confirmation_of :email_address, :message => "should match confirmation" - # end - # - # View: - # <%= password_field "person", "password" %> - # <%= password_field "person", "password_confirmation" %> - # - # Configuration options: - # - # * case_sensitive - Whether or not to apply case-sensitivity on the comparison. Defaults to true. - # * message - The message to add to the errors collection when the validation fails - # * times - The number of times the validation applies - # * level - The level at which the validation should occur - # * if - A block that when executed must return true of the validation will not occur - # * group - The group that this validation belongs to. A validation can belong to multiple groups - def validates_confirmation_of(*args) - add_validations(args, ValidatesConfirmationOf) - end - - # call-seq: validates_presence_of(*args) - # - # Validates that the specified attributes are not nil or an empty string - # - # class Person - # include Validatable - # validates_presence_of :first_name - # end - # - # The first_name attribute must be in the object and it cannot be nil or empty. - # - # Configuration options: - # - # * message - The message to add to the errors collection when the validation fails - # * times - The number of times the validation applies - # * level - The level at which the validation should occur - # * if - A block that when executed must return true of the validation will not occur - # * group - The group that this validation belongs to. A validation can belong to multiple groups - def validates_presence_of(*args) - add_validations(args, ValidatesPresenceOf) - end - - # call-seq: validates_true_for(*args) - # - # Validates that the logic evaluates to true - # - # class Person - # include Validatable - # validates_true_for :first_name, :logic => lambda { first_name == 'Jamie' } - # end - # - # The logic option is required. - # - # Configuration options: - # - # * message - The message to add to the errors collection when the validation fails - # * times - The number of times the validation applies - # * level - The level at which the validation should occur - # * if - A block that when executed must return true of the validation will not occur - # * group - The group that this validation belongs to. A validation can belong to multiple groups - # * logic - A block that executes to perform the validation - def validates_true_for(*args) - add_validations(args, ValidatesTrueFor) - end - - # call-seq: include_validations_for(attribute_to_validate, options = {}) - # - # Validates the specified attributes. - # class Person - # include Validatable - # validates_presence_of :name - # attr_accessor :name - # end - # - # class PersonPresenter - # include Validatable - # include_validations_for :person, :map => { :name => :namen }, :if => lambda { not person.nil? } - # attr_accessor :person - # - # def initialize(person) - # @person = person - # end - # end - # - # presenter = PersonPresenter.new(Person.new) - # presenter.valid? #=> false - # presenter.errors.on(:namen) #=> "can't be blank" - # - # The person attribute will be validated. If person is invalid the errors will be added to the PersonPresenter errors collection. - # - # Configuration options: - # - # * map - A hash that maps attributes of the child to attributes of the parent. - # * if - A block that when executed must return true of the validation will not occur. - def include_validations_for(attribute_to_validate, options = {}) - children_to_validate << ChildValidation.new(attribute_to_validate, options[:map] || {}, options[:if] || lambda { true }) - end - - def validate_children(instance, group) #:nodoc: + def validate_children(instance, group) self.children_to_validate.each do |child_validation| next unless child_validation.should_validate?(instance) child = instance.send child_validation.attribute if (child.respond_to?(:valid_for_group?)) child.valid_for_group?(group) @@ -214,43 +20,43 @@ end end end end - def validations #:nodoc: + def validations @validations ||= [] end - def add_error(instance, attribute, msg) #:nodoc: + def add_error(instance, attribute, msg) instance.errors.add(attribute, msg) end def validation_keys_include?(key) validations.map { |validation| validation.key }.include?(key) end protected - def add_validations(args, klass) #:nodoc: + def add_validations(args, klass) options = args.last.is_a?(Hash) ? args.pop : {} args.each do |attribute| new_validation = klass.new self, attribute, options self.validations << new_validation self.create_valid_method_for_groups new_validation.groups end end - def create_valid_method_for_groups(groups) #:nodoc: + def create_valid_method_for_groups(groups) groups.each do |group| self.class_eval do define_method "valid_for_#{group}?".to_sym do valid_for_group?(group) end end end end - def children_to_validate #:nodoc: + def children_to_validate @children_to_validate ||= [] end end end \ No newline at end of file