Class: ActiveModel::Validations::AcceptanceValidator::LazilyDefineAttributes

Inherits:
Module
  • Object
show all
Defined in:
activemodel/lib/active_model/validations/acceptance.rb

Constant Summary

Constants inherited from Module

Module::DELEGATION_RESERVED_KEYWORDS, Module::DELEGATION_RESERVED_METHOD_NAMES, Module::RUBY_RESERVED_KEYWORDS

Instance Method Summary collapse

Methods inherited from Module

#alias_attribute, #anonymous?, #attr_internal_accessor, #attr_internal_reader, #attr_internal_writer, #delegate, #delegate_missing_to, #deprecate, #mattr_accessor, #mattr_reader, #mattr_writer, #method_visibility, #module_parent, #module_parent_name, #module_parents, #parent, #parent_name, #parents, #redefine_method, #redefine_singleton_method, #remove_possible_method, #remove_possible_singleton_method, #silence_redefinition_of_method, #thread_mattr_accessor, #thread_mattr_reader, #thread_mattr_writer

Methods included from Module::Concerning

#concern, #concerning

Constructor Details

#initialize(attributes) ⇒ LazilyDefineAttributes

Returns a new instance of LazilyDefineAttributes.



28
29
30
# File 'activemodel/lib/active_model/validations/acceptance.rb', line 28

def initialize(attributes)
  @attributes = attributes.map(&:to_s)
end

Instance Method Details

#==(other) ⇒ Object



73
74
75
# File 'activemodel/lib/active_model/validations/acceptance.rb', line 73

def ==(other)
  self.class == other.class && attributes == other.attributes
end

#define_on(klass) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'activemodel/lib/active_model/validations/acceptance.rb', line 56

def define_on(klass)
  @lock&.synchronize do
    return unless @lock

    attr_readers = attributes.reject { |name| klass.attribute_method?(name) }
    attr_writers = attributes.reject { |name| klass.attribute_method?("#{name}=") }

    attr_reader(*attr_readers)
    attr_writer(*attr_writers)

    remove_method :respond_to_missing?
    remove_method :method_missing

    @lock = nil
  end
end

#included(klass) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'activemodel/lib/active_model/validations/acceptance.rb', line 32

def included(klass)
  @lock = Mutex.new
  mod = self

  define_method(:respond_to_missing?) do |method_name, include_private = false|
    mod.define_on(klass)
    super(method_name, include_private) || mod.matches?(method_name)
  end

  define_method(:method_missing) do |method_name, *args, &block|
    mod.define_on(klass)
    if mod.matches?(method_name)
      send(method_name, *args, &block)
    else
      super(method_name, *args, &block)
    end
  end
end

#matches?(method_name) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
54
# File 'activemodel/lib/active_model/validations/acceptance.rb', line 51

def matches?(method_name)
  attr_name = method_name.to_s.chomp("=")
  attributes.any? { |name| name == attr_name }
end