module Critic::Policy

Represents the authorization policy interface

Attributes

authorization[RW]
errors[R]
resource[R]
subject[R]

Public Class Methods

for(resource) click to toggle source
# File lib/critic/policy.rb, line 22
def self.for(resource)
  resource_class = resource_class_for(resource)

  policies.fetch(resource_class) { "#{resource_class}Policy".constantize }
end
new(subject, resource) click to toggle source
# File lib/critic/policy.rb, line 43
def initialize(subject, resource)
  @subject = subject
  @resource = resource
  @errors = []
end
policies() click to toggle source
# File lib/critic/policy.rb, line 6
def self.policies
  @_policies ||= Hash.new { |h, k| h[k.to_s] = nil }
end
resource_class_for(object) click to toggle source

@fixme do we really wish to demodulize ?

# File lib/critic/policy.rb, line 11
def self.resource_class_for(object)
  if object.respond_to?(:model_name)
    # used for pulling class out of ActiveRecord::Relation objects
    object.model_name
  elsif object.is_a?(Class)
    object.to_s.demodulize
  else
    object.class.to_s.demodulize
  end
end

Public Instance Methods

authorize(action, *args) click to toggle source
# File lib/critic/policy.rb, line 49
def authorize(action, *args)
  self.authorization = Critic::Authorization.new(self, action)

  result = catch(:halt) { process_authorization(action, args) }

  authorization.result = result if authorization.result.nil?

  case authorization.result
  # when Critic::Authorization
  #   # user has accessed authorization directly
  when String
    authorization.granted = false
    authorization.messages << result
  when nil, false
    authorization.granted = false
    authorization.messages << failure_message(action)
  else
    authorization.granted = true
  end

  authorization
end

Protected Instance Methods

failure_message(action) click to toggle source
# File lib/critic/policy.rb, line 80
def failure_message(action)
  "#{subject} is not authorized to #{action} #{resource}"
end
halt(*response) click to toggle source
# File lib/critic/policy.rb, line 84
def halt(*response)
  throw :halt, *response
end

Private Instance Methods

process_authorization(action, args) click to toggle source
# File lib/critic/policy.rb, line 90
def process_authorization(action, args)
  public_send(action, *args)
end