class ActionController::Parents::Finder

Used to find the parent resource

@api private

Constants

FIND_METHOD

Attributes

parent_resource_classes[R]
primary_keys[R]

Public Class Methods

new(*parent_resource_classes) click to toggle source

@param [Class<ActiveRecord::Base>] parent_resource_classes

# File lib/action_controller/parents/finder.rb, line 15
def initialize(*parent_resource_classes)
  @parent_resource_classes = parent_resource_classes.flatten
  assert_responds_to_find_method(@parent_resource_classes)
  setup_primary_keys
end

Public Instance Methods

parent_resource(params) click to toggle source

Finds the parent resources from the ActionController params hash @params [Hash] params @return [ActiveRecord::Base, nil]

# File lib/action_controller/parents/finder.rb, line 24
def parent_resource(params)
  key = find_primary_key(params)
  return nil unless key
  class_by_key(key).public_send(FIND_METHOD, params.fetch(key))
end

Private Instance Methods

assert_responds_to_find_method(classes) click to toggle source
# File lib/action_controller/parents/finder.rb, line 32
def assert_responds_to_find_method(classes)
  res = classes.find { |c| !c.respond_to?(FIND_METHOD) }
  unless res.nil?
    fail NoFindMethodError,
      "Parent resource #{res} doesn't respond to #{FIND_METHOD.inspect}"
  end
end
class_by_key(key) click to toggle source
# File lib/action_controller/parents/finder.rb, line 52
def class_by_key(key)
  primary_keys[key.to_s]
end
find_primary_key(params) click to toggle source

Looks for the primary key of any of the parent resources in the params hash @params [Hash] params @return [String, nil]

# File lib/action_controller/parents/finder.rb, line 44
def find_primary_key(params)
  params.keys.detect { |key| valid_primary_key?(key) }
end
setup_primary_keys() click to toggle source
# File lib/action_controller/parents/finder.rb, line 56
def setup_primary_keys
  @primary_keys = parent_resource_classes.each_with_object({}) do |klass, hsh|
    hsh[klass.to_s.foreign_key] = klass
  end
end
valid_primary_key?(key) click to toggle source
# File lib/action_controller/parents/finder.rb, line 48
def valid_primary_key?(key)
  !class_by_key(key).nil?
end