Permalink
Browse files

Adding :class option to load_resource so one can customize which clas…

…s to use for the model - closes #17
  • Loading branch information...
1 parent e9f0130 commit 021f33c9a0bf2f9a60ba1b4f19b5d21a0f25b7ca @ryanb committed Dec 14, 2009
View
@@ -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
@@ -59,6 +59,9 @@ def load_and_authorize_resource(options = {})
#
# load_resource :nested => [:publisher, :author]
#
+ # [:+class+]
+ # The class to use for the model.
+ #
# [:+collection+]
# 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+
@@ -72,7 +75,7 @@ def load_and_authorize_resource(options = {})
# fetch one.
#
# load_resource :new => :build
- #
+ #
def load_resource(options = {})
before_filter(options.slice(:only, :except)) { |c| ResourceAuthorization.new(c, c.params, options.except(:only, :except)).load_resource }
end
@@ -99,6 +102,9 @@ def load_resource(options = {})
# [:+except+]
# Does not apply before filter to given actions.
#
+ # [:+class+]
+ # The class to use for the model.
+ #
def authorize_resource(options = {})
before_filter(options.slice(:only, :except)) { |c| ResourceAuthorization.new(c, c.params, options.except(:only, :except)).authorize_resource }
end
@@ -1,13 +1,14 @@
module CanCan
class ControllerResource # :nodoc:
- def initialize(controller, name, parent = nil)
+ def initialize(controller, name, parent = nil, options = {})
@controller = controller
@name = name
@parent = parent
+ @options = options
end
def model_class
- @name.to_s.camelize.constantize
+ @options[:class] || @name.to_s.camelize.constantize
end
def find(id)
@@ -30,7 +30,7 @@ def authorize_resource
private
def resource
- @resource ||= ControllerResource.new(@controller, model_name, parent_resource)
+ @resource ||= ControllerResource.new(@controller, model_name, parent_resource, @options)
end
def parent_resource
@@ -40,4 +40,10 @@
CanCan::ControllerResource.new(@controller, :ability).find(123)
@controller.instance_variable_get(:@ability).should == :some_ability
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
@@ -105,4 +105,11 @@
@controller.instance_variable_get(:@person).should == :some_person
@controller.instance_variable_get(:@ability).should == :some_ability
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

0 comments on commit 021f33c

Please sign in to comment.