【问题标题】:Rails scope for ApplicationController methodsApplicationController 方法的 Rails 范围
【发布时间】:2013-05-20 21:28:10
【问题描述】:
当我从继承控制器(如 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 会调用位于 UsersController 内还是 ApplicationController 内的 method2?
谢谢!
【问题讨论】:
标签:
ruby-on-rails
ruby
scope
【解决方案1】:
新类UsersController继承了原类ApplicationController的所有方法。当您 defUsersController 中的新方法时,它会替换父控制器中的定义,但任何其他方法仍然存在,并在调用它们时进行评估。
所以,UsersController#method1 将调用 UsersController#method2。每当调用方法时,ruby 都会从当前上下文向上搜索堆栈,直到找到匹配的方法:
1) 检查UsersController#method1,什么也没找到
2) 它检查ApplicationController#method1,并执行它,它调用#method2
3) 它检查UsersController#method2,找到并执行。
【解决方案2】:
继承类(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