module Rolify::Role

Public Class Methods

included(base) click to toggle source
# File lib/rolify/role.rb, line 8
def self.included(base)
  base.extend Finders
end

Public Instance Methods

add_role(role_name, resource = nil) click to toggle source
# File lib/rolify/role.rb, line 12
def add_role(role_name, resource = nil)
  role = self.class.adapter.find_or_create_by(role_name.to_s,
                                              (resource.is_a?(Class) ? resource.to_s : resource.class.name if resource),
                                              (resource.id if resource && !resource.is_a?(Class)))

  if !roles.include?(role)
    self.class.define_dynamic_method(role_name, resource) if Rolify.dynamic_shortcuts
    self.class.adapter.add(self, role)
  end
  role
end
Also aliased as: grant
grant(role_name, resource = nil)
Alias for: add_role
has_all_roles?(*args) click to toggle source
# File lib/rolify/role.rb, line 56
def has_all_roles?(*args)
  args.each do |arg|
    if arg.is_a? Hash
      return false if !self.has_role?(arg[:name], arg[:resource])
    elsif arg.is_a?(String) || arg.is_a?(Symbol)
      return false if !self.has_role?(arg)
    else
      raise ArgumentError, "Invalid argument type: only hash or string or symbol allowed"
    end
  end
  true
end
has_any_role?(*args) click to toggle source
# File lib/rolify/role.rb, line 69
def has_any_role?(*args)
  if new_record?
    args.any? { |r| self.has_role?(r) }
  else
    self.class.adapter.where(self.roles, *args).size > 0
  end
end
has_cached_role?(role_name, resource = nil) click to toggle source
# File lib/rolify/role.rb, line 47
def has_cached_role?(role_name, resource = nil)
  return has_strict_cached_role?(role_name, resource) if self.class.strict_rolify and resource and resource != :any
  self.class.adapter.find_cached(self.roles, name: role_name, resource: resource).any?
end
has_role?(role_name, resource = nil) click to toggle source
# File lib/rolify/role.rb, line 25
def has_role?(role_name, resource = nil)
  return has_strict_role?(role_name, resource) if self.class.strict_rolify and resource and resource != :any

  if new_record?
    role_array = self.roles.detect { |r|
      r.name.to_s == role_name.to_s &&
        (r.resource == resource ||
         resource.nil? ||
         (resource == :any && r.resource.present?))
    }
  else
    role_array = self.class.adapter.where(self.roles, name: role_name, resource: resource)
  end

  return false if role_array.nil?
  role_array != []
end
has_strict_cached_role?(role_name, resource = nil) click to toggle source
# File lib/rolify/role.rb, line 52
def has_strict_cached_role?(role_name, resource = nil)
  self.class.adapter.find_cached_strict(self.roles, name: role_name, resource: resource).any?
end
has_strict_role?(role_name, resource) click to toggle source
# File lib/rolify/role.rb, line 43
def has_strict_role?(role_name, resource)
  self.class.adapter.where_strict(self.roles, name: role_name, resource: resource).any?
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/rolify/role.rb, line 92
def method_missing(method, *args, &block)
  if method.to_s.match(/^is_(\w+)_of[?]$/) || method.to_s.match(/^is_(\w+)[?]$/)
    resource = args.first
    self.class.define_dynamic_method $1, resource
    return has_role?("#{$1}", resource)
  end if Rolify.dynamic_shortcuts
  super
end
only_has_role?(role_name, resource = nil) click to toggle source
# File lib/rolify/role.rb, line 77
def only_has_role?(role_name, resource = nil)
  return self.has_role?(role_name,resource) && self.roles.count == 1
end
remove_role(role_name, resource = nil) click to toggle source
# File lib/rolify/role.rb, line 81
def remove_role(role_name, resource = nil)
  self.class.adapter.remove(self, role_name.to_s, resource)
end
Also aliased as: revoke
respond_to?(method, include_private = false) click to toggle source
Calls superclass method
# File lib/rolify/role.rb, line 101
def respond_to?(method, include_private = false)
  if Rolify.dynamic_shortcuts && (method.to_s.match(/^is_(\w+)_of[?]$/) || method.to_s.match(/^is_(\w+)[?]$/))
    query = self.class.role_class.where(:name => $1)
    query = self.class.adapter.exists?(query, :resource_type) if method.to_s.match(/^is_(\w+)_of[?]$/)
    return true if query.count > 0
    false
  else
    super
  end
end
revoke(role_name, resource = nil)
Alias for: remove_role
roles_name() click to toggle source
# File lib/rolify/role.rb, line 88
def roles_name
  self.roles.pluck(:name)
end