Module: Roles::Role

Defined in:
lib/roles/role.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



74
75
76
77
78
79
80
81
82
# 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

Class Method Details

.included(base) ⇒ Object



3
4
5
# File 'lib/roles/role.rb', line 3

def self.included(base)
  base.extend ClassMethods
end

Instance Method Details

#add_role(role_name, resource = nil) ⇒ Object Also known as: grant



19
20
21
22
23
24
25
26
27
# File 'lib/roles/role.rb', line 19

def add_role(role_name, resource = nil)
  if resource.nil?
    self.roles.where(:resource_type => nil).where(:resource_id => nil).find_or_create_by_name(:name => role_name.to_s)
  elsif resource.is_a? Class
    self.roles.where(:resource_type => resource.to_s).where(:resource_id => nil).find_or_create_by_name(:name => role_name.to_s)
  else
    self.roles.where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).find_or_create_by_name(:name => role_name.to_s)
  end
end

#has_role?(role_name, resource = nil) ⇒ Boolean

Returns:

  • (Boolean)


30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/roles/role.rb', line 30

def has_role?(role_name, resource = nil)
  if new_record?
    self.roles.detect { |r| r.name == role_name.to_s && (r.resource == resource || resource.nil?) }.present?
  else
    if resource.nil?
      self.roles.where(:name => role_name.to_s).where(:resource_type => nil).where(:resource_id => nil).size > 0
    elsif resource.is_a? Class
      self.roles.where(:name => role_name.to_s).where(:resource_type => resource.to_s).where(:resource_id => nil).size > 0
    else
      self.roles.where(:name => role_name.to_s).where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).size > 0
    end
  end
end

#remove_role(role_name, resource = nil) ⇒ Object Also known as: revoke



44
45
46
47
48
49
50
51
52
# File 'lib/roles/role.rb', line 44

def remove_role(role_name, resource = nil)
  if resource.nil?
    self.roles.where(:name => role_name.to_s).where(:resource_type => nil).where(:resource_id => nil).destroy_all
  elsif resource.is_a? Class
    self.roles.where(:name => role_name.to_s).where(:resource_type => resource.to_s).where(:resource_id => nil).destroy_all
  else
    self.roles.where(:name => role_name.to_s).where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).destroy_all
  end
end

#resources_with_role(resource_class, role_name = nil) ⇒ Object



66
67
68
69
70
71
72
# File 'lib/roles/role.rb', line 66

def resources_with_role(resource_class, role_name = nil)
  if role_name.nil?
    resource_class.includes(:roles).where("roles.#{self.class.user_cname.underscore.singularize}_id = %s", self.id).where("roles.resource_type LIKE '%s'", resource_class.to_s)
  else
    resource_class.includes(:roles).where("roles.#{self.class.user_cname.underscore.singularize}_id = %s", self.id).where("roles.resource_type LIKE '%s'", resource_class.to_s).where("roles.name LIKE '%s'", role_name.to_s)
  end
end

#role_names(resource = nil) ⇒ Object



56
57
58
59
60
61
62
63
64
# File 'lib/roles/role.rb', line 56

def role_names(resource = nil)
  if resource.nil?
    self.roles.where(:resource_type => nil).where(:resource_id => nil).select(:name).map { |r| r.name }
  elsif resource.is_a? Class
    self.roles.where(:resource_type => resource.name).where(:resource_id => nil).select(:name).map { |r| r.name }
  else
    self.roles.where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).select(:name).map { |r| r.name }
  end
end