如何从其父级获取子类控制器的controller_name?

时间:2011-02-13 21:36:42

标签: ruby-on-rails ruby

我正在使用一些也从父控制器继承的命名空间控制器。在每个子类中,我需要(for anyone wondering why...):

class Fruits::ApplesController < FruitsController
  # controller_name below is 'apples'
  require_dependency "fruits/#{controller_name}"
  ...
end

所以,因为我宁愿在我的父类中使用require_dependency一行,我试图将它移动到FruitsController,但问题是controller_name现在等于“fruits”..

class FruitsController < ApplicationController
  # controller_name is 'fruits' no matter which subclassed controller is called
  require_dependency "fruits/#{controller_name}"
  ...
end

那么如何在FruitsController中正确获取子类控制器名称的值,以便我可以将require_dependency行保留在子类之外? controller_path也没有帮助。

谢谢!

3 个答案:

答案 0 :(得分:2)

如上所述,您的“require_dependency”语句仅在父项加载时执行一次。

你可能会使用Class#inherited方法来要求你的依赖,就像这样(代码未经测试)。

class FruitsController < ApplicationController
  def self.inherited(subclass)
    subclass.require_dependency subclass.to_s.underscore
  end
end

答案 1 :(得分:0)

Fruits类中的上述require语句在加载父类时只执行一次,这意味着子类不会再次执行它。请检查以下示例:

class A
  puts name
end

class B < A
end
#=> A

所以,你必须为每个子类执行一个单独的require,因此你不能以你想要的方式重构它。

答案 2 :(得分:0)

正如我在回复@ElliotNelson时提到的那样(非常感谢btw!),这是我放在FruitsController中的代码,它允许我重新考虑原始代码:

def self.inherited(subclass)    
  subclass.require_dependency subclass.controller_name
  super
end
相关问题