Module: RoleModel

Defined in:
lib/role_model.rb,
lib/role_model/roles.rb

Defined Under Namespace

Modules: ClassMethods Classes: Roles

Constant Summary collapse

INHERITABLE_CLASS_ATTRIBUTES =
[:roles_attribute_name, :valid_roles]

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

:nodoc:



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/role_model.rb', line 7

def self.included(base) # :nodoc:
  base.extend ClassMethods
  base.class_eval do
    class << self
      attr_accessor(*::RoleModel::INHERITABLE_CLASS_ATTRIBUTES)
    end
    roles_attribute :roles_mask
  end

  # assign roles
  def roles=(*roles)
    self.send("#{self.class.roles_attribute_name}=", (Array[*roles].flatten.map { |r| r.to_sym } & self.class.valid_roles).map { |r| 2**self.class.valid_roles.index(r) }.inject { |sum, bitvalue| sum + bitvalue })
  end

  # query assigned roles
  def roles
    Roles.new(self, self.class.valid_roles.reject { |r| ((self.send(self.class.roles_attribute_name) || 0) & 2**self.class.valid_roles.index(r)).zero? })
  end
  alias role_symbols roles

  # check if a given role has been assigned
  def has_role?(role)
    roles.include?(role.to_sym)
  end
  alias is_a? has_role?
end

Instance Method Details

#has_role?(role) ⇒ Boolean

check if a given role has been assigned

Returns:

  • (Boolean)


28
29
30
# File 'lib/role_model.rb', line 28

def has_role?(role)
  roles.include?(role.to_sym)
end

#rolesObject

query assigned roles



22
23
24
# File 'lib/role_model.rb', line 22

def roles
  Roles.new(self, self.class.valid_roles.reject { |r| ((self.send(self.class.roles_attribute_name) || 0) & 2**self.class.valid_roles.index(r)).zero? })
end

#roles=(*roles) ⇒ Object

assign roles



17
18
19
# File 'lib/role_model.rb', line 17

def roles=(*roles)
  self.send("#{self.class.roles_attribute_name}=", (Array[*roles].flatten.map { |r| r.to_sym } & self.class.valid_roles).map { |r| 2**self.class.valid_roles.index(r) }.inject { |sum, bitvalue| sum + bitvalue })
end