123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::FilterAttributeHandler

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: activerecord/lib/active_record/filter_attribute_handler.rb

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(app) ⇒ FilterAttributeHandler

[ GitHub ]

  
# File 'activerecord/lib/active_record/filter_attribute_handler.rb', line 18

def initialize(app)
  @app = app
  @attributes_by_class = Concurrent::Map.new
  @collecting = true
end

Class Method Details

.on_sensitive_attribute_declared(&block)

[ GitHub ]

  
# File 'activerecord/lib/active_record/filter_attribute_handler.rb', line 6

def on_sensitive_attribute_declared(&block)
  @sensitive_attribute_declaration_listeners ||= Concurrent::Array.new
  @sensitive_attribute_declaration_listeners << block
end

.sensitive_attribute_was_declared(klass, list)

[ GitHub ]

  
# File 'activerecord/lib/active_record/filter_attribute_handler.rb', line 11

def sensitive_attribute_was_declared(klass, list)
  @sensitive_attribute_declaration_listeners&.each do |block|
    block.call(klass, list)
  end
end

Instance Attribute Details

#app (readonly, private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/filter_attribute_handler.rb', line 32

attr_reader :app

#collecting?Boolean (readonly, private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/filter_attribute_handler.rb', line 54

def collecting?
  @collecting
end

Instance Method Details

#apply_collected_attributes (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/filter_attribute_handler.rb', line 48

def apply_collected_attributes
  @attributes_by_class.each do |klass, list|
    apply_filter(klass, list)
  end
end

#apply_filter(klass, list) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/filter_attribute_handler.rb', line 63

def apply_filter(klass, list)
  list.each do |attribute|
    next if klass.abstract_class? || klass == Base

    klass_name = klass.name ? klass.model_name.element : nil
    filter = [klass_name, attribute.to_s].compact.join(".")
    app.config.filter_parameters << filter unless app.config.filter_parameters.include?(filter)
  end
end

#attribute_was_declared(klass, list) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/filter_attribute_handler.rb', line 40

def attribute_was_declared(klass, list)
  if collecting?
    collect_for_later(klass, list)
  else
    apply_filter(klass, list)
  end
end

#collect_for_later(klass, list) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/filter_attribute_handler.rb', line 58

def collect_for_later(klass, list)
  @attributes_by_class[klass] ||= Concurrent::Array.new
  @attributes_by_class[klass] += list
end

#enable

[ GitHub ]

  
# File 'activerecord/lib/active_record/filter_attribute_handler.rb', line 24

def enable
  install_collecting_hook

  apply_collected_attributes
  @collecting = false
end

#install_collecting_hook (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/filter_attribute_handler.rb', line 34

def install_collecting_hook
  self.class.on_sensitive_attribute_declared do |klass, list|
    attribute_was_declared(klass, list)
  end
end