load member through method instead of instance variable to improve decent_exposure support

This commit is contained in:
Ryan Bates 2011-06-13 15:16:08 -07:00
parent f6c2054f7e
commit b8ff2dbc6a
2 changed files with 15 additions and 1 deletions

View File

@ -148,7 +148,13 @@ module CanCan
end
def resource_instance
@controller.instance_variable_get("@#{instance_name}") if load_instance?
if load_instance?
if @controller.instance_variable_defined? "@#{instance_name}"
@controller.instance_variable_get("@#{instance_name}")
elsif @controller.respond_to?(instance_name, true)
@controller.send(instance_name)
end
end
end
def collection_instance=(instance)

View File

@ -336,6 +336,14 @@ describe CanCan::ControllerResource do
CanCan::ControllerResource.new(@controller, :authorize => true).process
end
it "should fetch member through method when instance variable is not provided" do
stub(@controller).project { :some_project }
@params.merge!(:action => "show", :id => 123)
stub(@controller).authorize!(:show, :some_project) { raise CanCan::Unauthorized }
resource = CanCan::ControllerResource.new(@controller, :authorize => true)
lambda { resource.process }.should raise_error(CanCan::Unauthorized)
end
# it "should raise ImplementationRemoved when adding :name option" do
# lambda {
# CanCan::ControllerResource.new(@controller, :name => :foo)