2012-02-16 14 views
7

Modele dahil ettiğim bir modülü ad alanı oluşturmakta sorun yaşıyorum. /lib/search/car.rb /config/application.rbAd alanlı modüller ve Raylar 3.1.3 autoload_path

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

içinde

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

içinde /app/models/car.rb

class Car 
include Search::Car 
end 

içinde

Garip olan şey, sunucuyu açtığımda doğrudan bir hata almama. Bir süre sonra tarayıcıyı yenileyin eğer Ama bu hatayı alıyorum:

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

problemin doğası ile ilgili bir şey olduğunu gösterir:

/config/environments/development.rb

I Search yeri tanımlayan Ayrıca güvenilir
config.cache_classes = false 

/lib doğrudan bir dosya search.rb koyun:

module Search 
    # Put shared methods here 
end 

Neyi yanlış yapıyorum?

GÜNCELLEME:

Tamam, adlandırmak eğer Search::CarSearch::CarSearch için çalıştığını çıkıyor. Farklı bir kapsamda aynı ada sahip Modül/Sınıflara sahip olmak mümkün değil mi?

+0

farklı kapsamlarda aynı adı taşıyan Modüller/Sınıfları olabilir, ama o zaman modül Araba yöntemleri kullanırken:

Bu çizgiyi (sadece lib dizini için AutoLoad olmalıdır) kaldırmalısınız belirsizliği kaldırmak için kapsamı belirtmelisiniz. –

+0

Hey, yorumunuz için teşekkürler. Ben de öyle düşündüm ama işe yaramıyor. Herhangi bir fikri neden hata alıyorum? – Yeggeps

cevap

4

Hata, autoload_paths öğenizden geliyor. config.autoload_paths += Dir["#{config.root}/lib/**/"], tüm dizinleri ve alt dizinlerini lib dizini altına ekleyecektir. lib/search/dizinini otomatik olarak yüklemek için raylar söylediğiniz anlamına gelir, bu nedenle bu dizinin altındaki car.rb aracının Araba tanımlamasının ve Arama'nın yapılmaması bekleniyor. Rayların lib/search/car.rb'nin Search :: Car'i tanımlamasını beklemesi için lib/dizinini lib/dizin değil otomatik olarak yüklemeniz gerekir. Eğer config.autoload_paths += Dir["#{config.root}/lib/"] size AutoLoad değiştirip aşağıdaki kodla/lib search.rb koyarsanız:

module Search 
    require 'search/car' 
end 

sonra lib/arama/car.rb anlamak ve bekler raylar tanımlıyorsunuz Arama :: Araba ve referans Araç modülü/kodunuzun diğer yerlerinde bu car.rb. , config.autoload_paths += Dir["#{config.root}/lib/search/*"]