module EffectiveRoles
Constants
- VERSION
Public Class Methods
assignable_roles_collection(resource, current_user = nil)
click to toggle source
# File lib/effective_roles.rb, line 75 def self.assignable_roles_collection(resource, current_user = nil) return roles unless assignable_roles_present?(resource) if current_user && !current_user.respond_to?(:is_role_restricted?) raise('expected current_user to respond to is_role_restricted?') end if !resource.respond_to?(:is_role_restricted?) raise('expected current_user to respond to is_role_restricted?') end assigned_roles = if assignable_roles.kind_of?(Hash) assignable = (assignable_roles[resource.class.to_s] || assignable_roles || {}) assigned = [] # our return value if current_user.blank? assigned = assignable.values.flatten end if current_user.present? assigned = current_user.roles.map { |role| assignable[role] }.flatten.compact end if assignable[:new_record] && resource.new_record? assigned += Array(assignable[:new_record]) end if assignable[:persisted] && resource.persisted? assigned += Array(assignable[:persisted]) end assigned elsif assignable_roles.kind_of?(Array) assignable_roles end.uniq assigned_roles end
assignable_roles_present?(resource)
click to toggle source
# File lib/effective_roles.rb, line 114 def self.assignable_roles_present?(resource) return false unless assignable_roles.present? raise 'EffectiveRoles config.assignable_roles_for must be a Hash or Array' unless [Hash, Array].include?(assignable_roles.class) raise('expected resource to respond to is_role_restricted?') unless resource.respond_to?(:is_role_restricted?) if assignable_roles.kind_of?(Array) assignable_roles elsif assignable_roles.key?(resource.class.to_s) assignable_roles[resource.class.to_s] else assignable_roles end.present? end
color(role)
click to toggle source
# File lib/effective_roles.rb, line 42 def self.color(role) raise('expected a role') unless role.kind_of?(Symbol) (role_colors || {})[role] end
config_keys()
click to toggle source
# File lib/effective_roles.rb, line 7 def self.config_keys [:roles, :role_descriptions, :role_colors, :assignable_roles, :layout] end
permitted_params()
click to toggle source
# File lib/effective_roles.rb, line 13 def self.permitted_params { roles: [] } end
roles_collection(resource, current_user = nil, only: nil, except: nil, skip_disabled: nil)
click to toggle source
# File lib/effective_roles.rb, line 47 def self.roles_collection(resource, current_user = nil, only: nil, except: nil, skip_disabled: nil) if assignable_roles.present? raise('expected object to respond to is_role_restricted?') unless resource.respond_to?(:is_role_restricted?) raise('expected current_user to respond to is_role_restricted?') if current_user && !current_user.respond_to?(:is_role_restricted?) end only = Array(only).compact except = Array(except).compact skip_disabled = assignable_roles.kind_of?(Hash) if skip_disabled.nil? all_roles = assignable_roles_collection(resource) assignable = assignable_roles_collection(resource, current_user) all_roles.map do |role| next if only.present? && !only.include?(role) next if except.present? && except.include?(role) disabled = !assignable.include?(role) next if disabled && skip_disabled [ "#{role}<small class='form-text text-muted'>#{role_description(role, resource)}</small>".html_safe, role, ({:disabled => :disabled} if disabled) ] end.compact end
roles_for(obj)
click to toggle source
This method converts whatever is given into its roles Pass an object, Integer, or Symbol to find corresponding role
# File lib/effective_roles.rb, line 19 def self.roles_for(obj) if obj.respond_to?(:is_role_restricted?) obj.roles elsif obj.kind_of?(Integer) roles.reject { |r| (obj & 2 ** config.roles.index(r)).zero? } elsif obj.kind_of?(Symbol) Array(roles.find { |role| role == obj }) elsif obj.kind_of?(String) Array(roles.find { |role| role == obj.to_sym }) elsif obj.kind_of?(Array) obj.map { |obj| roles_for(obj) }.flatten.compact elsif obj.nil? [] else raise 'unsupported object passed to EffectiveRoles.roles_for method. Expecting an acts_as_role_restricted object or a roles_mask integer' end end
roles_mask_for(*roles)
click to toggle source
EffectiveRoles.roles_mask_for
(:admin, :member)
# File lib/effective_roles.rb, line 38 def self.roles_mask_for(*roles) roles_for(roles).map { |r| 2 ** config.roles.index(r) }.sum end
Private Class Methods
role_description(role, obj = nil)
click to toggle source
# File lib/effective_roles.rb, line 131 def self.role_description(role, obj = nil) raise 'EffectiveRoles config.role_descriptions must be a Hash' unless role_descriptions.kind_of?(Hash) description = role_descriptions.dig(obj.class.to_s, role) if obj.present? description ||= role_descriptions[role] description || '' end