module ActionPolicy::LookupChain

LookupChain contains resolvers to determine a policy for a record (with additional options).

You can modify the `LookupChain.chain` (for example, to add custom resolvers).

Constants

CLASSIFY_SYMBOL_LOOKUP

(Optional) Infer using String#classify if available

CLASS_POLICY_CLASS

By record's class `policy_class` method

INFER_FROM_CLASS

Infer from class name

INSTANCE_POLICY_CLASS

By self `policy_class` method

SYMBOL_LOOKUP

Infer from passed symbol

Attributes

chain[RW]
namespace_cache_enabled[RW]
namespace_cache_enabled?[RW]

Public Class Methods

call(record, **opts) click to toggle source
# File lib/action_policy/lookup_chain.rb, line 57
def call(record, **opts)
  chain.each do |probe|
    val = probe.call(record, **opts)
    return val unless val.nil?
  end
  nil
end

Private Class Methods

lookup_within_namespace(policy_name, namespace, strict: false) click to toggle source
# File lib/action_policy/lookup_chain.rb, line 67
def lookup_within_namespace(policy_name, namespace, strict: false)
  NamespaceCache.fetch(namespace&.name || "Kernel", policy_name, strict: strict) do
    mod = namespace
    loop do
      policy = [mod&.name, policy_name].compact.join("::").safe_constantize
      break policy if policy || mod.nil? || strict

      mod = mod.namespace
    end
  end
end
policy_class_name_for(record) click to toggle source
# File lib/action_policy/lookup_chain.rb, line 79
def policy_class_name_for(record)
  return record.policy_name.to_s if record.respond_to?(:policy_name)

  record_class = record.is_a?(Module) ? record : record.class

  if record_class.respond_to?(:policy_name)
    record_class.policy_name.to_s
  else
    "#{record_class}Policy"
  end
end