繁体   English   中英

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

[英]How to I get the controller_name of a subclassed controller from its parent?

我正在使用一些也从父控制器继承的命名空间控制器。 在每个子类中,我都需要拥有( 对于任何想知道为什么...的人 ):

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也无济于事。

谢谢!

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

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

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

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

class A
  puts name
end

class B < A
end
#=> A

因此,您必须为每个子类执行单独的require,因此您无法以您想要的方式重构它。

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

def self.inherited(subclass)    
  subclass.require_dependency subclass.controller_name
  super
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM