class Permissionable::Permissions

Public Class Methods

new(owner) click to toggle source
# File lib/permissionable/permissions.rb, line 3
def initialize(owner)
  @owner = owner
  if @owner.respond_to?(:read_attribute)
    @permissions_integer = @owner.read_attribute(:permissions_integer)
  else
    @permissions_integer = 0
  end
end

Public Instance Methods

<<(*permissions)
Alias for: add
[](*permissions)
Alias for: include?
add(*permissions) click to toggle source

Add new permissions will safely ignore any permissions already granted Usage: MyModel.last.permissions.add(:write) MyModel.last.permissions.add(:write, :read)

# File lib/permissionable/permissions.rb, line 21
def add(*permissions)
  permissions.flatten!
  control_definitions(permissions)
  permissions.each do |permission|
    new_permission = defined_permissions[permission]
    @permissions_integer += new_permission unless include?(permission)
  end
  sync_with_owner
end
Also aliased as: <<
clear!() click to toggle source
# File lib/permissionable/permissions.rb, line 62
def clear!
  @permissions_integer = 0
  sync_with_owner
end
include?(*permissions) click to toggle source

Check if resource has permission Usage: resource.permissions.include?(:write) resource.permissions.include?(:write, :read) @param *permissions [Array] @return [TrueClass, FalseClass]

# File lib/permissionable/permissions.rb, line 52
def include?(*permissions)
  permissions.flatten!
  control_definitions(permissions)
  # Sum the corresponding int value of all
  # permissions provided in the argument list
  asserted = permissions.inject(0){ |mem, permission| mem + defined_permissions[permission] }
  @permissions_integer & asserted == asserted
end
Also aliased as: []
remove(*permissions) click to toggle source

Remove existing permissions will safely ignore any permissions not already granted Usage: resource.permissions.remove(:write) resource.permissions.remove(:write, :read)

# File lib/permissionable/permissions.rb, line 37
def remove(*permissions)
  permissions.flatten!
  control_definitions(permissions)
  permissions.each do |permission|
    @permissions_integer -= defined_permissions[permission] if include?(permission)
  end
  sync_with_owner
end
to_i() click to toggle source
# File lib/permissionable/permissions.rb, line 12
def to_i
  @permissions_integer
end

Private Instance Methods

control_definitions(permissions) click to toggle source
# File lib/permissionable/permissions.rb, line 69
def control_definitions(permissions)
  permissions.each do |permission|
    raise "Permission #{permission} not defined" if defined_permissions[permission].nil?
  end
end
defined_permissions() click to toggle source
# File lib/permissionable/permissions.rb, line 86
def defined_permissions
  @owner.class.get_permissions
end
sync_with_owner() click to toggle source
# File lib/permissionable/permissions.rb, line 75
def sync_with_owner
  if @owner.respond_to?(:permissions_integer=)
    @owner.permissions_integer = @permissions_integer
  end
  if @owner.respond_to?(:update_column)
    if @owner.respond_to?(:persisted?) && @owner.persisted?
      @owner.update_column(:permissions_integer, @permissions_integer)
    end
  end
end