lib/cancan-permits/permits/ability.rb in cancan-permits-0.1.4 vs lib/cancan-permits/permits/ability.rb in cancan-permits-0.2.1

- old
+ new

@@ -2,50 +2,59 @@ class Ability include CanCan::Ability # set up each Permit instance to share this same Ability # so that the can and cannot operations work on the same permission collection! - def self.permits ability + def self.permits ability, options = {} special_permits = [] - special_permits << [:system, :any].map{|role| make_permit(role, ability)} + special_permits << [:system, :any].map{|role| make_permit(role, ability, options)} + # puts "Available roles: #{Permits::Roles.available}" role_permits = Permits::Roles.available.inject([]) do |permits, role| - permit = make_permit(role, ability) + permit = make_permit(role, ability, options) + # puts "made permit: #{permit}" permits << permit if permit end + # puts "role_permits: #{role_permits.inspect}" (special_permits + role_permits).flatten.compact end - def initialize(user, request=nil) + def initialize user, options = {} # put ability logic here! user ||= Guest.new - - Permits::Ability.permits(self).each do |permit| + + all_permits = Permits::Ability.permits(self, options) + # puts "Trying permits: #{all_permits.inspect}" + all_permits.each do |permit| # get role name of permit permit_role = permit.class.demodulize.gsub(/Permit$/, '').underscore.to_sym - + + # puts "Permit role: #{permit_role.inspect}" if permit_role == :system # always execute system permit - result = role_permit.permit?(user, request) + result = permit.permit?(user, options) break if result == :break else # only execute the permit if the user has the role of the permit or is for any role + # puts "does user have_role? #{user.has_role?(permit_role)}, #{user.inspect}" if user.has_role?(permit_role) || permit_role == :any # puts "user: #{user} of #{permit_role} has permit?" - permit.permit?(user, request) - # else + # puts "permit: #{permit.inspect}" + permit.permit?(user, options) + # else # puts "Permit #{permit} not used for role #{permit_role}" end end end end protected - def self.make_permit role, ability + def self.make_permit role, ability, options = {} begin clazz_name = "#{role.to_s.camelize}Permit" + # puts "Attempting to load #{clazz_name} permition class" permit_clazz = clazz_name.constantize - permit_clazz.new(ability) if permit_clazz && permit_clazz.kind_of?(Class) + permit_clazz.new(ability, options) if permit_clazz && permit_clazz.kind_of?(Class) rescue # puts "permit class not found: #{clazz_name}" nil end end