我有一个具有以下架构的Ruby项目:
Project architecture
我的所有子控制器(city1,city2)都从项目根目录的父控制器继承。我在父控制器中有一个方法:
class Controller
def get_directories
Dir.chdir(File.dirname(__FILE__) + "/")
Dir.glob('*').select { |f| File.directory? f }
end
end
我的孩子控制员:
require_relative '../controller'
class City1Controller < Controller
end
和
require_relative '../controller'
class City2Controller < Controller
end
根据我的理解,此方法查看当前的工作目录并返回该目录中的文件夹数组。
我希望子控制器以这样的方式继承这个函数,其中get_directories将是子目录的本地,但是它显示了父目录中的文件夹。
这就是发生的事情:
controller.get_directories => city1 city2
city1_controller.get_directories => city1 city2
city2_controller.get_directories => city1 city2
这就是我想要发生的事情:
controller.get_directories => city1 city2
city1_controller.get_directories => monument1 monument2
city2_controller.get_directories => monument3 monument4
如果我在每个子控制器中重复完全相同的方法(从而覆盖父定义),它就会按照我想要的方式工作。但这不是继承应该饶恕我们的吗?
方法本身的问题,继承如何工作或我如何使用它?
答案 0 :(得分:1)
正如塞尔吉奥已经指出的那样:__FILE__
不是一种方法。它是对当前文件名称的引用,它返回一个相对路径,指向它所在的文件。
一个选项可能是将__FILE__
传递给方法,如下所示:
class Controller
def get_directories(file = __FILE__)
Dir.chdir(File.dirname(file) + "/")
Dir.glob('*').select { |f| File.directory? f }
end
end
儿童控制器:
require_relative '../controller'
class City1Controller < Controller
def get_directories
super(__FILE__)
end
end
和
require_relative '../controller'
class City2Controller < Controller
def get_directories
super(__FILE__)
end
end