module Moat
Constants
- POLICY_CLASS_SUFFIX
- VERSION
Public Instance Methods
moat_user()
click to toggle source
# File lib/moat.rb, line 54 def moat_user current_user end
policy_filter(scope, action = action_name, user: moat_user, policy: find_policy(scope))
click to toggle source
# File lib/moat.rb, line 38 def policy_filter(scope, action = action_name, user: moat_user, policy: find_policy(scope)) apply_policy(scope, action, user: user, policy: policy::Filter) end
skip_verify_policy_applied()
click to toggle source
# File lib/moat.rb, line 62 def skip_verify_policy_applied @_moat_policy_applied = true end
Also aliased as: policy_applied
verify_policy_applied()
click to toggle source
# File lib/moat.rb, line 58 def verify_policy_applied fail PolicyNotAppliedError unless @_moat_policy_applied end
Private Instance Methods
apply_policy(scope_or_resource, action, user:, policy:)
click to toggle source
# File lib/moat.rb, line 70 def apply_policy(scope_or_resource, action, user:, policy:) policy_instance = policy.new(user, scope_or_resource) fail(ActionNotFoundError, action: action, policy: policy) unless policy_instance.respond_to?(action) policy_applied policy_instance.public_send(action) end
find_policy(object)
click to toggle source
# File lib/moat.rb, line 78 def find_policy(object) policy = if object.nil? nil elsif object.respond_to?(:policy_class) object.policy_class elsif object.class.respond_to?(:policy_class) object.class.policy_class else infer_policy(object) end policy || fail(PolicyNotFoundError) end
infer_policy(object)
click to toggle source
Infer the policy from the object's type. If it is not found from the object's class directly, go up the ancestor chain.
# File lib/moat.rb, line 94 def infer_policy(object) initial_policy_inference_class = policy_inference_class(object) policy_inference_class = initial_policy_inference_class while policy_inference_class policy = load_policy_from_class(policy_inference_class) return policy if policy policy_inference_class = policy_inference_class.superclass end fail PolicyNotFoundError, initial_policy_inference_class.name end
load_policy_from_class(klass)
click to toggle source
# File lib/moat.rb, line 106 def load_policy_from_class(klass) Object.const_get("#{policy_inference_class(klass).name}#{POLICY_CLASS_SUFFIX}") rescue NameError nil end
policy_inference_class(object)
click to toggle source
# File lib/moat.rb, line 112 def policy_inference_class(object) if object.respond_to?(:model) # For ActiveRecord::Relation object.model elsif object.is_a?(Class) object else object.class end end