Adding :class option to load_resource so one can customize which class to use for the model - closes #17

This commit is contained in:
Ryan Bates 2009-12-14 08:31:49 -08:00
parent e9f01300b6
commit 021f33c9a0
6 changed files with 26 additions and 4 deletions

View File

@ -1,3 +1,5 @@
* Adding :class option to load_resource so one can customize which class to use for the model - see issue #17
* Don't fetch parent of nested resource if *_id parameter is missing so it works with shallow nested routes - see issue #14 * Don't fetch parent of nested resource if *_id parameter is missing so it works with shallow nested routes - see issue #14

View File

@ -59,6 +59,9 @@ module CanCan
# #
# load_resource :nested => [:publisher, :author] # load_resource :nested => [:publisher, :author]
# #
# [:+class+]
# The class to use for the model.
#
# [:+collection+] # [:+collection+]
# Specify which actions are resource collection actions in addition to :+index+. This # Specify which actions are resource collection actions in addition to :+index+. This
# is usually not necessary because it will try to guess depending on if an :+id+ # is usually not necessary because it will try to guess depending on if an :+id+
@ -99,6 +102,9 @@ module CanCan
# [:+except+] # [:+except+]
# Does not apply before filter to given actions. # Does not apply before filter to given actions.
# #
# [:+class+]
# The class to use for the model.
#
def authorize_resource(options = {}) def authorize_resource(options = {})
before_filter(options.slice(:only, :except)) { |c| ResourceAuthorization.new(c, c.params, options.except(:only, :except)).authorize_resource } before_filter(options.slice(:only, :except)) { |c| ResourceAuthorization.new(c, c.params, options.except(:only, :except)).authorize_resource }
end end

View File

@ -1,13 +1,14 @@
module CanCan module CanCan
class ControllerResource # :nodoc: class ControllerResource # :nodoc:
def initialize(controller, name, parent = nil) def initialize(controller, name, parent = nil, options = {})
@controller = controller @controller = controller
@name = name @name = name
@parent = parent @parent = parent
@options = options
end end
def model_class def model_class
@name.to_s.camelize.constantize @options[:class] || @name.to_s.camelize.constantize
end end
def find(id) def find(id)

View File

@ -30,7 +30,7 @@ module CanCan
private private
def resource def resource
@resource ||= ControllerResource.new(@controller, model_name, parent_resource) @resource ||= ControllerResource.new(@controller, model_name, parent_resource, @options)
end end
def parent_resource def parent_resource

View File

@ -40,4 +40,10 @@ describe CanCan::ControllerResource do
CanCan::ControllerResource.new(@controller, :ability).find(123) CanCan::ControllerResource.new(@controller, :ability).find(123)
@controller.instance_variable_get(:@ability).should == :some_ability @controller.instance_variable_get(:@ability).should == :some_ability
end end
it "should use the model class option if provided" do
stub(Person).find(123) { :some_resource }
CanCan::ControllerResource.new(@controller, :ability, nil, :class => Person).find(123)
@controller.instance_variable_get(:@ability).should == :some_resource
end
end end

View File

@ -105,4 +105,11 @@ describe CanCan::ResourceAuthorization do
@controller.instance_variable_get(:@person).should == :some_person @controller.instance_variable_get(:@person).should == :some_person
@controller.instance_variable_get(:@ability).should == :some_ability @controller.instance_variable_get(:@ability).should == :some_ability
end end
it "should load the model using a custom class" do
stub(Person).find(123) { :some_resource }
authorization = CanCan::ResourceAuthorization.new(@controller, {:controller => "abilities", :action => "show", :id => 123}, {:class => Person})
authorization.load_resource
@controller.instance_variable_get(:@ability).should == :some_resource
end
end end