Module: Rolify::Role

Extended by:
Utils
Defined in:
lib/rolify/role.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Utils

deprecate

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

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



65
66
67
68
69
70
71
72
73
74
# File 'lib/rolify/role.rb', line 65

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
      self.class.define_dynamic_method $1, resource
      return has_role?("#{$1}", resource)
    end
  end unless !Rolify.dynamic_shortcuts
  super
end

Class Method Details

.included(base) ⇒ Object



7
8
9
# File 'lib/rolify/role.rb', line 7

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

Instance Method Details

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



11
12
13
14
15
16
17
18
19
20
21
# File 'lib/rolify/role.rb', line 11

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

#has_all_roles?(*args) ⇒ Boolean

Returns:

  • (Boolean)


33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/rolify/role.rb', line 33

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) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
# File 'lib/rolify/role.rb', line 46

def has_any_role?(*args)
  self.class.adapter.where(self.roles, *args).size > 0
end

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

Returns:

  • (Boolean)


25
26
27
28
29
30
31
# File 'lib/rolify/role.rb', line 25

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
    self.class.adapter.where(self.roles, :name => role_name, :resource => resource).size > 0
  end
end

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

Returns:

  • (Boolean)


50
51
52
# File 'lib/rolify/role.rb', line 50

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) ⇒ Object Also known as: revoke



54
55
56
# File 'lib/rolify/role.rb', line 54

def remove_role(role_name, resource = nil)
  self.class.adapter.remove(self, role_name, resource)
end

#respond_to?(method, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
79
80
81
82
83
84
85
# File 'lib/rolify/role.rb', line 76

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

#roles_nameObject



61
62
63
# File 'lib/rolify/role.rb', line 61

def roles_name
  self.roles.select(:name).map { |r| r.name }
end