Rails适用于ApplicationController方法的范围

时间:2013-05-20 21:28:10

标签: ruby-on-rails ruby scope

当我从一个继承控制器(如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内部?

谢谢!

2 个答案:

答案 0 :(得分:7)

新类UsersController继承了原始类ApplicationController中的所有方法。在defUsersController新方法时,它会替换父控制器中的定义,但任何其他方法仍然存在,并在调用它们时进行评估。

因此,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