passing block to enable_authorization will be executed when CanCan::Unauthorized exception is raised

This commit is contained in:
Ryan Bates 2011-03-25 16:08:09 -07:00
parent cf2896f011
commit 35fbee578f
2 changed files with 13 additions and 3 deletions

View File

@ -251,19 +251,20 @@ module CanCan
# #
# enable_authorization :unless => :devise_controller? # enable_authorization :unless => :devise_controller?
# #
def enable_authorization(options = {}) def enable_authorization(options = {}, &block)
self.before_filter(options.slice(:only, :except)) do |controller| before_filter(options.slice(:only, :except)) do |controller|
break if options[:if] && !controller.send(options[:if]) break if options[:if] && !controller.send(options[:if])
break if options[:unless] && controller.send(options[:unless]) break if options[:unless] && controller.send(options[:unless])
controller.authorize! controller.params[:action], controller.params[:controller] controller.authorize! controller.params[:action], controller.params[:controller]
end end
self.after_filter(options.slice(:only, :except)) do |controller| after_filter(options.slice(:only, :except)) do |controller|
break if options[:if] && !controller.send(options[:if]) break if options[:if] && !controller.send(options[:if])
break if options[:unless] && controller.send(options[:unless]) break if options[:unless] && controller.send(options[:unless])
unless controller.current_ability.fully_authorized? controller.params[:action], controller.params[:controller] unless controller.current_ability.fully_authorized? controller.params[:action], controller.params[:controller]
raise CanCan::InsufficientAuthorizationCheck, "Authorization check is not sufficient for this action. This is probably because you have a conditions or attributes defined in Ability and are not checking for them in the action." raise CanCan::InsufficientAuthorizationCheck, "Authorization check is not sufficient for this action. This is probably because you have a conditions or attributes defined in Ability and are not checking for them in the action."
end end
end end
rescue_from(CanCan::Unauthorized, &block) if block
end end
def cancan_resource_class def cancan_resource_class

View File

@ -95,4 +95,13 @@ describe CanCan::ControllerAdditions do
@controller_class.enable_authorization(:unless => :engine_controller?) @controller_class.enable_authorization(:unless => :engine_controller?)
@authorize_called.should be_false @authorize_called.should be_false
end end
it "enable_authorization should pass block to rescue_from CanCan::Unauthorized call" do
@block_called = false
mock(@controller_class).before_filter({})
mock(@controller_class).after_filter({})
mock(@controller_class).rescue_from(CanCan::Unauthorized) { |options, block| block.call(:exception) }
@controller_class.enable_authorization { |e| @block_called = (e == :exception) }
@block_called.should be_true
end
end end