当我从一个继承控制器(如UsersController<)中调用一个存在于ApplicationController内的方法时ApplicationController,该方法的范围是什么? ApplicationController或UsersController?
假设我有这些文件
class ApplicationController < ActionController::Base
def method1
method2
end
def method2
...
end
end
class UsersController < ApplicationController
# call method1 from here
def method2
...
end
end
所以你可以在这里看到,我从UsersController调用method1(它位于appcontroller中); 请问method1是否将方法2调用到UsersController内部或ApplicationController内部?
谢谢!
答案 0 :(得分:7)
新类UsersController
继承了原始类ApplicationController
中的所有方法。在def
中UsersController
新方法时,它会替换父控制器中的定义,但任何其他方法仍然存在,并在调用它们时进行评估。
因此,UsersController#method1
会调用UsersController#method2
。无论何时调用方法,ruby都会从当前上下文中搜索堆栈,直到找到匹配的方法:
1)它检查UsersController#method1
,找不到任何内容
2)它检查ApplicationController#method1
并执行它,调用#method2
3)它检查找到并执行的UsersController#method2
。
答案 1 :(得分:1)
继承类(UserController)中的方法将覆盖继承类(ApplicationController)中的方法。
class ApplicationController < ActionController::Base
def method1
method2 # => 'foo'
method3 # => 'foobar'
end
def method2
'foo'
end
def method3
'foobar'
end
end
class UsersController < ApplicationController
# call method1 from here
def method1
method2 # => 'bar'
method3 # => 'foobar'
end
def method2
'bar'
end
end