Sha256: 36c460af76bda40b86707df54c882de1d8170186e4ee767fd4afdf51f19401e3
Contents?: true
Size: 1.86 KB
Versions: 1
Compression:
Stored size: 1.86 KB
Contents
module Allowance class Permissions def initialize(context, &blk) @permissions = {} @context = context instance_exec(context, &blk) end def can?(*args) if ![Symbol, Class].include?(args.last.class) thing = args.pop args.push(thing.class) end if (p = find_permission(*args)).present? thing ? scoped_model(*args).find(:first, conditions: { id: thing.id }).present? : true else false end end def can(*args) options = args.pop if args.last.is_a?(Hash) || args.last.is_a?(Proc) object = args.pop unless args.last.is_a?(Symbol) expand_permissions(args).each do |verb| permissions[permission_identifier(verb, object)] ||= options || true end end def scoped_model(*args) model = args.last # TODO: check that model is a class if p = find_permission(*args) if p.is_a?(Hash) model.where(p) elsif p.is_a?(Proc) (p.arity == 0 ? model.instance_exec(&p) : model.call(r)) else model end else model.where(false) end end def find_permission(*args) object = args.pop unless args.last.is_a?(Symbol) args.flatten.each do |verb| if p = permissions[permission_identifier(verb, object)] return p end end nil end private def expand_permissions(*permissions) permissions.flatten.map do |p| case p when :manage then [:manage, :index, :show, :new, :create, :edit, :update, :destroy] when :view then [:view, :index, :show] else p end end.flatten end def permission_identifier(verb, object) raise "Can't use enumerables as verbs" if verb.is_a?(Enumerable) [verb.to_sym, object].compact end attr_reader :permissions end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
allowance-0.0.1 | lib/allowance/permissions.rb |