Adding :class option to load_resource so one can customize which class to use for the model - closes #17
This commit is contained in:
		
							parent
							
								
									e9f01300b6
								
							
						
					
					
						commit
						021f33c9a0
					
				@ -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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user