lib/whyvalidationssuckin96/macros/validates_exclusion.rb in whyvalidationssuckin96-1.5.2 vs lib/whyvalidationssuckin96/macros/validates_exclusion.rb in whyvalidationssuckin96-1.5.3

- old
+ new

@@ -1,32 +1,44 @@ require 'whyvalidationssuckin96/skippable_validation' require 'whyvalidationssuckin96/attribute_based_validation' module WhyValidationsSuckIn96 - + # Checks the validity of an attribute against a collection of excluded values. # # @example Default usage # setup_validations do # validates_exclusion_of :subdomain, :in => %w[www ftp] # end - class ValidatesExclusion < Validation + # + # @example Usage when checking a set of values against another set + # setup_validations do + # validates_exclusion_of :colours, :in => %w[red green], :set => true + # # colours can now be an array containing anything except 'red' or 'green' + # end + class ValidatesExclusion < Validation include WhyValidationsSuckIn96::SkippableValidation include WhyValidationsSuckIn96::AttributeBasedValidation - - DefaultOptions = {:message => "is in the excluded collection"} - - # @param [Object] validatable An object to be validated. - # @param [Hash] options The options to set up the validation with. - # @option options [#include?] :in A collection to check against for exclusion. + + DefaultOptions = {:message => "is in the excluded collection", + :set => false} + + # @param [Object] validatable An object to be validated. + # @param [Hash] options The options to set up the validation with. + # @option options [#include?] :in A collection to check against for exclusion. + # @option options [true, false] :set Whether or not to do a set based comparison def initialize(validatable, options = {}) super raise(ArgumentError, "Collection to check for exclusion against should be specified with :in") unless options[:in] end - + def validate super - if options[:in].include?(attribute_value) + if options[:set] + attribute_value.any? do |val| + options[:in].include?(val) + end ? fail : pass + elsif !options[:set] && options[:in].include?(attribute_value) fail else pass end end \ No newline at end of file