Class: Axn::Validation::Fields

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Validations
Defined in:
lib/axn/core/validation/fields.rb

Constant Summary collapse

ModelValidator =

NOTE: defining classes where needed b/c we explicitly register it’ll affect ALL the consuming apps’ validators as well

Validators::ModelValidator
TypeValidator =
Validators::TypeValidator
ValidateValidator =
Validators::ValidateValidator
OfValidator =
Validators::OfValidator
ShapeValidator =
Validators::ShapeValidator

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(context) ⇒ Fields

Returns a new instance of Fields.



15
16
17
# File 'lib/axn/core/validation/fields.rb', line 15

def initialize(context)
  @context = context
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name) ⇒ Object



25
26
27
28
29
30
31
32
# File 'lib/axn/core/validation/fields.rb', line 25

def method_missing(method_name, ...)
  # Delegate method calls to the action instance to support symbol-based validations
  # like inclusion: { in: :valid_channels_for_number }
  action = _action_for_validation
  return super unless action && action.respond_to?(method_name, true) # rubocop:disable Style/SafeNavigation

  action.send(method_name, ...)
end

Class Method Details

.validate!(validations:, context:, exception_klass:) ⇒ Object

Raises:

  • (exception_klass)


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/axn/core/validation/fields.rb', line 41

def self.validate!(validations:, context:, exception_klass:)
  validator = Class.new(self) do
    def self.name = "Axn::Validation::Fields::OneOff"

    validations.each do |field, field_validations|
      field_validations.each do |key, value|
        validates field, key => value
      end
    end
  end.new(context)

  return if validator.valid?

  raise exception_klass, validator.errors
end

Instance Method Details

#read_attribute_for_validation(attr) ⇒ Object



19
20
21
22
23
# File 'lib/axn/core/validation/fields.rb', line 19

def read_attribute_for_validation(attr)
  # The context here is actually a facade (InternalContext or Result)
  # which already handles reading from the correct data source
  @context.public_send(attr)
end

#respond_to_missing?(method_name, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


34
35
36
37
38
39
# File 'lib/axn/core/validation/fields.rb', line 34

def respond_to_missing?(method_name, include_private = false)
  action = _action_for_validation
  return super unless action

  action.respond_to?(method_name, include_private) || super
end