2016-10-30 3 views
-4

У меня есть проект 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 

Если я повторить тот же метод в каждом контроллере ребенка (тем самым отменяя родительское определение), он работает как я хочу. Но разве не то, что наследство должно нас пощадить?

Является ли проблема в самом методе, как работает наследование или как я его использую?

+2

сообщение здесь все напрямую. Никакая часть вашего вопроса не должна опираться на внешний сайт. И если у вас есть код, разместите его здесь как текст, а не изображение. – Carcigenicate

+0

Извините, мне пришлось устранить неполадки, какая часть моего текстового стека не понравилась (дала ошибку о коде) –

+1

Проблема в том, как вы ее используете. '__FILE__' не является методом, и вы не должны ожидать от него поведения, подобного методу. –

ответ

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 
Смежные вопросы