我正在使用一些也从父控制器继承的命名空间控制器。在每个子类中,我需要(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也没有帮助。
谢谢!
答案 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