2012-02-16 10 views
7

モデルに含めるモジュールの名前空間に問題があります。 /lib/search/car.rb /config/application.rb名前空間付きモジュールとRails 3.1.3 autoload_path

config.autoload_paths += Dir["#{config.root}/lib/**/"] 
config.autoload_paths += Dir["#{config.root}/lib/search/*"] 

module Search 
    module Car 
    include ActiveSupport::Concern 
    # methods in here 
    end 
end 

で/app/models/car.rb

class Car 
include Search::Car 
end 

奇妙なことは、サーバーを起動するときに直接エラーが発生しないということです。 しかし、私は、私はこのエラーを取得し、しばらくして、ブラウザを更新した場合:

/config/environments/development.rb

Expected #{Rails.root}/lib/search/car.rb to define Car 

問題の性質は、それがとは何かを持っていることを示しています私も試してみました

config.cache_classes = false 

は私がSearchを定義/libで直接ファイルsearch.rbを置く:

module Search 
    # Put shared methods here 
end 

私は間違っていますか?

UPDATE:

[OK]を、私はSearch::CarSearchSearch::Carの名前を変更する場合、それが動作することが判明しました。 同じ名前のモジュール/クラスを異なるスコープに含めることはできませんか?

+0

をあなたは異なるスコープに同じ名前のモジュール/クラスを持つことができますが、あなたはモジュールの車のメソッドを使用しているとき、あいまいさを取り除くには、スコープを指定する必要があります。 –

+0

ねえ、ご意見ありがとうございます。私もそうだと思ったが、うまくいかないようだ。なぜ私はエラーが発生する任意のアイデア? – Yeggeps

答えて

4

エラーは、あなたのautoload_pathsから来ています。 config.autoload_paths += Dir["#{config.root}/lib/**/"]はlibディレクトリの下にすべてのディレクトリとそのサブディレクトリを追加します。 lib/search /ディレクトリを自動ロードするように指示しているので、そのディレクトリの下のcar.rbはSearch :: CarではなくCarを定義することが期待されます。レールでlib/search/car.rbがSearch :: Carを定義することを期待するには、lib /ディレクトリを自動ロードし、lib/searchを自動ロードする必要がありません。あなたはconfig.autoload_paths += Dir["#{config.root}/lib/"]に自動ロードし、次のコードで/ libにsearch.rbを入れて変更した場合:

module Search 
    require 'search/car' 
end 

その後、レールはlibに/検索/ car.rbを理解し、期待して検索を定義します::車と参照カーモジュール/あなたのコードの他の場所のクラスはこのcar.rbを参照しません。

あなたはこの行(あなたが唯一のlibディレクトリのためのautoloadを持っている必要があります)を削除する必要があります config.autoload_paths += Dir["#{config.root}/lib/search/*"]

関連する問題