module Roles::Role

Public Class Methods

included(base) click to toggle source
# File lib/roles/role.rb, line 3
def self.included(base)
  base.extend ClassMethods
end

Public Instance Methods

add_role(role_name, resource = nil) click to toggle source
# File lib/roles/role.rb, line 19
def add_role(role_name, resource = nil)
  if resource.nil?
    self.send(self.class.role_table).where(:resource_type => nil).where(:resource_id => nil).where(:name => role_name.to_s).first_or_create
  elsif resource.is_a? Class
    self.send(self.class.role_table).where(:resource_type => resource.to_s).where(:resource_id => nil).where(:name => role_name.to_s).first_or_create
  else
    self.send(self.class.role_table).where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).where(:name => role_name.to_s).first_or_create
  end
end
Also aliased as: grant
grant(role_name, resource = nil)
Alias for: add_role
has_role?(role_name, resource = nil) click to toggle source
# File lib/roles/role.rb, line 30
def has_role?(role_name, resource = nil)
  if new_record?
    self.send(self.class.role_table).detect { |r| r.name == role_name.to_s && (r.resource == resource || resource.nil?) }.present?
  else
    if resource.nil?
      self.send(self.class.role_table).where(:name => role_name.to_s).where(:resource_type => nil).where(:resource_id => nil).size > 0
    elsif resource.is_a? Class
      self.send(self.class.role_table).where(:name => role_name.to_s).where(:resource_type => resource.to_s).where(:resource_id => nil).size > 0
    else
      self.send(self.class.role_table).where(:name => role_name.to_s).where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).size > 0
    end
  end
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/roles/role.rb, line 74
def method_missing(method, *args, &block)
  if method.to_s.match(/^is_(\w+)_of[?]$/) || method.to_s.match(/^is_(\w+)[?]$/)
    if self.class.role_class.where(:name => $1).count > 0
      resource = args.first
      return has_role?("#{$1}", resource)
    end
  end
  super
end
remove_role(role_name, resource = nil) click to toggle source
# File lib/roles/role.rb, line 44
def remove_role(role_name, resource = nil)
  if resource.nil?
    self.send(self.class.role_table).where(:name => role_name.to_s).where(:resource_type => nil).where(:resource_id => nil).destroy_all
  elsif resource.is_a? Class
    self.send(self.class.role_table).where(:name => role_name.to_s).where(:resource_type => resource.to_s).where(:resource_id => nil).destroy_all
  else
    self.send(self.class.role_table).where(:name => role_name.to_s).where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).destroy_all
  end
end
Also aliased as: revoke
resources_with_role(resource_class, role_name = nil) click to toggle source
# File lib/roles/role.rb, line 66
def resources_with_role(resource_class, role_name = nil)
  if role_name.nil?
    resource_class.includes(self.class.role_table).where("#{self.class.role_table}.#{self.class.user_cname.underscore.singularize}_id = %s", self.id).where("#{self.class.role_table}.resource_type LIKE '%s'", resource_class.to_s)
  else
    resource_class.includes(self.class.role_table).where("#{self.class.role_table}.#{self.class.user_cname.underscore.singularize}_id = %s", self.id).where("#{self.class.role_table}.resource_type LIKE '%s'", resource_class.to_s).where("#{self.class.role_table}.name LIKE '%s'", role_name.to_s)
  end
end
revoke(role_name, resource = nil)
Alias for: remove_role
role_names(resource = nil) click to toggle source
# File lib/roles/role.rb, line 56
def role_names(resource = nil)
  if resource.nil?
    self.send(self.class.role_table).where(:resource_type => nil).where(:resource_id => nil).select(:name).map { |r| r.name }
  elsif resource.is_a? Class
    self.send(self.class.role_table).where(:resource_type => resource.name).where(:resource_id => nil).select(:name).map { |r| r.name }
  else
    self.send(self.class.role_table).where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).select(:name).map { |r| r.name }
  end
end