2016-10-30 5 views
-4

してください。は、私は次のようなアーキテクチャを持つRubyプロジェクトを持って継承された機能の動的

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

直接ここにすべてのものを投稿

1つのオプションは、このような方法に__FILE__を渡すかもしれません。あなたの質問の一部は外部サイトに依存してはいけません。コードをお持ちの場合は、画像ではなくテキストとしてここに投稿してください。 – Carcigenicate

+0

申し訳ありませんが、私のテキストstackoverflowのどの部分が好きではなかった(コードについてのエラーを与えた)トラブルシューティングをしなければならなかった –

+1

問題はどのようにそれを使用しています。 '__FILE__'はメソッドではないので、メソッドのような動作を期待してはいけません。 –

答えて

1

セルジオはすでに指摘したとおり:__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 
関連する問題