module Themis::Validation

Extends other modules to make them be validation modules. Consider it as the “parent module” for all validation modules.

@example define UserValidation

module UserValidation
  extend Themis::Validation

  validates :email   , :presence => true
  validates :nickname, :presence => true
end

Public Instance Methods

included(base) click to toggle source

When included in another module: copy {Validator validators} to another module. When included in ActiveRecord model: define validators on model. @param [Module, ActiveRecord::Base] base another validation module or ActiveRecord model.

# File lib/themis/validation.rb, line 27
def included(base)
  if base.instance_of?(Module) && base.respond_to?(:validators)
    base.validators.concat(validators)
  elsif base.ancestors.include? ::ActiveRecord::Base
    apply_to_model!(base)
  else
    raise "Validation module `#{self.inspect}` can be included only in another validation module or in ActiveRecord model"
  end
end
validators() click to toggle source

Array {Validator validators} defined in module. @return [Array<Validator>] array of module's validators

# File lib/themis/validation.rb, line 20
def validators
  @validators ||= []
end

Private Instance Methods

apply_to_model!(model_class) click to toggle source

Add validators to model @param [ActiveRecord::Base] model_class

# File lib/themis/validation.rb, line 49
def apply_to_model!(model_class)
  validators.each do |validator|
    method, args = validator.name, validator.args
    model_class.send(method, *args)
  end
end
method_missing(method_name, *args) click to toggle source

Save all calls of validation methods as array of validators

Calls superclass method
# File lib/themis/validation.rb, line 38
def method_missing(method_name, *args)
  if method_name.to_s =~ /\Avalidate/
    self.validators << Themis::Validation::Validator.new(method_name, args)
  else
    super
  end
end