2016-05-10 5 views
1

私のRailsアプリケーションには、APIラッパーを構成するすべてのクラスを保持するモジュールがあります。モジュールを複数のファイルに分割する方法は?

(ファイル:zway.rb)ので、私はそれを分割したい

module Zway 
    class API 
    # instantiates API object 
    end 

    class Main 
    # holds top level functions 
    end 

    class Controller 
    # holds controller functions 
    end 

    class Error < StandardError 
    end 
    class BadRequestError < Error 
    end 
end 

は今、そのモジュールを1つのファイルに保管するには大きすぎるなっているここで、モジュールの構造です。モジュールにはいくつかのクラスがあるので、大きなクラスはすべて1つのファイルでなければならないと思いました。だから私はたくさん考えていませんでしたが、それがうまくいくかどうかを調べるために1つのクラスを取りに出そうとしました。

(ファイル:zway.rb)

module Zway 
    class API 
    # instantiates API object 
    end 

    class Controller 
    # holds controller functions 
    end 

    class Error < StandardError 
    end 
    class BadRequestError < Error 
    end 
end 

(ファイル:main.rb)

module Zway 
    class Main 
    end 
end 

しかし、今、私は私に権利鳴らない、このエラーを取得していますので、同様私はエラーが文句まさにそうであるように:main.rbでクラスを定義するメイン:

Unable to autoload constant Main, expected /bla/homer/app/models/main.rb to define it 

私はモジュールを使用する方法をネットで検索しましたが、主に私が見つけたのは、複数の継承と名前空間に関することでした。しかし、コードを整理するためのモジュールの使用に関する実践についてではありません。

答えて

1

クラスにモジュールを配置する場合は、規約に従って、module_nameという名前のフォルダ内にクラスを定義する必要があります。それが組織の全ポイントです。このようなことをして、それを行かせることができます。まず、あなたのコードを整理し、このようなファイル - >

models/ 
    zway/ 
    main.rb 
    zway.rb 

そして、あなたのmain.rbの内側にあなたはこのようにそれを名前空間 - >

class Zway::Main 
    ... 
end 

とごzway.rbの内側に、あなたはモジュール

を定義します
module Zway 
    ... 
end 

このように、メインクラスにアクセスしようとすると、その名前空間に変換されてから、慣習的にフォルダzwayの中でファイルを検索します。そして、あなたのすべてのモデルはそれぞれのフォルダ内にきれいに整理されています。

+1

これは価値があるので、道に迷って自分自身を救って、 'module Zway; 'class Zway :: Main'ではなく' class Main'(ネストされたもの)です。名前空間の参照に関しては2つの結果が異なり、前者は通常あなたが期待するものです。もっと徹底的に探検しました(http://randycoulman.com//blog/2014/12/09/namespaced-classes-in-rails/) –

関連する問題