Class: Themis::AR::ModelProxy

Inherits:
Object
  • Object
show all
Defined in:
lib/themis/ar/model_proxy.rb

Overview

It wraps a model class to override validation parameters and add(update) :if option. Also it provides some DSL syntax to include validation modules.

See where exactly it does its job:

class User
  has_validation :soft do |validation|
    validation.class  # => ModelProxy
  end
end

Instance Method Summary collapse

Constructor Details

#initialize(model_class, condition) ⇒ ModelProxy

Returns a new instance of ModelProxy.

Parameters:

  • model_class (ActiveRecord::Base)
  • condition (Proc)

    lambda which is passed as :if option for conditional validation



16
17
18
19
# File 'lib/themis/ar/model_proxy.rb', line 16

def initialize(model_class, condition)
  @model_class = model_class
  @condition   = condition
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(*args) ⇒ Object

Defines conditional validation by adding(updating) :if option to original method call.



32
33
34
35
# File 'lib/themis/ar/model_proxy.rb', line 32

def method_missing(*args)
  cargs = args_with_condition(args)
  @model_class.send(*cargs)
end

Instance Method Details

#args_with_condition(arguments) ⇒ Object

Build new arguments with modified :if option to make validation conditional.

Parameters:

  • arguments (Array)

    validation method and its options



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/themis/ar/model_proxy.rb', line 41

def args_with_condition(arguments)
  # Ala deep duplication to not override original array.
  args = arguments.map { |v| v.is_a?(Symbol) ? v : v.dup }

  if args.last.is_a?(Hash)
    old_opts = args.pop
    args << build_opts(old_opts)
  else
    args << build_opts
  end

  args
end

#include(validation_module) ⇒ Object

Defines conditional validations from module.

Parameters:



23
24
25
26
27
28
# File 'lib/themis/ar/model_proxy.rb', line 23

def include(validation_module)
  validation_module.validators.each do |validator|
    cargs = args_with_condition(validator.args)
    @model_class.send(validator.name, *cargs)
  end
end