support loading resource :through method along with instance variable - closes #146
This commit is contained in:
parent
264e2d2b68
commit
c11ffb6fd1
|
@ -69,7 +69,7 @@ module CanCan
|
||||||
# Does not apply before filter to given actions.
|
# Does not apply before filter to given actions.
|
||||||
#
|
#
|
||||||
# [:+through+]
|
# [:+through+]
|
||||||
# Load this resource through another one. This should match the name of the parent instance variable.
|
# Load this resource through another one. This should match the name of the parent instance variable or method.
|
||||||
#
|
#
|
||||||
# [:+shallow+]
|
# [:+shallow+]
|
||||||
# Pass +true+ to allow this resource to be loaded directly when parent is +nil+. Defaults to +false+.
|
# Pass +true+ to allow this resource to be loaded directly when parent is +nil+. Defaults to +false+.
|
||||||
|
|
|
@ -145,7 +145,15 @@ module CanCan
|
||||||
|
|
||||||
# The object to load this resource through.
|
# The object to load this resource through.
|
||||||
def parent_resource
|
def parent_resource
|
||||||
@options[:through] && [@options[:through]].flatten.map { |i| @controller.instance_variable_get("@#{i}") }.compact.first
|
@options[:through] && [@options[:through]].flatten.map { |i| fetch_parent(i) }.compact.first
|
||||||
|
end
|
||||||
|
|
||||||
|
def fetch_parent(name)
|
||||||
|
if @controller.instance_variable_defined? "@#{name}"
|
||||||
|
@controller.instance_variable_get("@#{name}")
|
||||||
|
elsif @controller.respond_to? name
|
||||||
|
@controller.send(name)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def name
|
def name
|
||||||
|
|
|
@ -164,7 +164,7 @@ describe CanCan::ControllerResource do
|
||||||
@controller.instance_variable_get(:@project).should == :some_project
|
@controller.instance_variable_get(:@project).should == :some_project
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should load resource through the association of another parent resource" do
|
it "should load resource through the association of another parent resource using instance variable" do
|
||||||
@params.merge!(:action => "show", :id => 123)
|
@params.merge!(:action => "show", :id => 123)
|
||||||
category = Object.new
|
category = Object.new
|
||||||
@controller.instance_variable_set(:@category, category)
|
@controller.instance_variable_set(:@category, category)
|
||||||
|
@ -174,6 +174,16 @@ describe CanCan::ControllerResource do
|
||||||
@controller.instance_variable_get(:@project).should == :some_project
|
@controller.instance_variable_get(:@project).should == :some_project
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should load resource through the association of another parent resource using method" do
|
||||||
|
@params.merge!(:action => "show", :id => 123)
|
||||||
|
category = Object.new
|
||||||
|
stub(@controller).category { category }
|
||||||
|
stub(category).projects.stub!.find(123) { :some_project }
|
||||||
|
resource = CanCan::ControllerResource.new(@controller, :through => :category)
|
||||||
|
resource.load_resource
|
||||||
|
@controller.instance_variable_get(:@project).should == :some_project
|
||||||
|
end
|
||||||
|
|
||||||
it "should not load through parent resource if instance isn't loaded when shallow" do
|
it "should not load through parent resource if instance isn't loaded when shallow" do
|
||||||
@params.merge!(:action => "show", :id => 123)
|
@params.merge!(:action => "show", :id => 123)
|
||||||
stub(Project).find(123) { :some_project }
|
stub(Project).find(123) { :some_project }
|
||||||
|
|
Loading…
Reference in New Issue
Block a user