【问题标题】: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2012-02-18
    • 2011-08-19
    • 2020-06-14
    相关资源
    最近更新 更多