Rails

2012-03-21 13 views
15

adında yer alan sınıflarla birlikte "uyarı: A: B tarafından başvurulan toplevel sabiti B'nin önlenmesi" Özel bir dizinde (Ör: app/presenters/) dosyaları saklarken, adı geçen sınıfların yüklendiğinden nasıl emin oluyorsunuz? ÖrneğinRails

, varsa:

CatalogPresenter.new 
=> #<CatalogPresenter:0x85bca68 @_routes=nil> 

MegaMenu::CatalogPresenter.new 
(irb):3: warning: toplevel constant CatalogPresenter referenced by MegaMenu::CatalogPresenter 
=> #<CatalogPresenter:0x85750a0 @_routes=nil> 
: başarısız
  • app/presenters/mega_menu/catalog_presenter.rb
  • Raylar

    cevap

    17

    Bir başlatıcısı bir ihtiyaç deyimini kullanarak bu sorunu çözdü. Çok sevmiyorum ama uygulamamın yapısını ve sınıf isimlerini çok beğendim, mantıklı olduklarından bir başlatıcı benim en iyi çözümümdü. başlatıcı denemede: özdevinimli_yükle sizin durumda olmayacak hangi çağrılan const_missing dayandığı için

    require File.join(Rails.root, "app", "presenters", "mega_menu", "catalog_presenter") 
    require File.join(Rails.root, "app", "presenters", "catalog_presenter") 
    

    Bu sorun oluşur.

    Ruby ilk kez MegaMenu :: CatalogPresenter'a bir başvuruyla karşılaştığında, mega_menu/catalog_presenter.rb dosyası dahil edilmemiştir. Standart yakut davranışı, isim-alanı ağacını (konuşma figürü) yürürlüğe sokmasına neden olur ve bunun yerine, bu noktaya dahil edildiğinden, üst düzey referansı olan CatalogPresenter'ı bulur.

    +0

    Bu, uygulama/modeller dizinine aynı şekilde uygulanır mı? Bir uygulama/modeller/kişiler/data.rb var ve veri zaten tanımlanmış olduğundan aynı özel durum var. – joshhepworth

    +2

    Bu, her yerde geçerli olacaktır. Bu sadece eksik sabitlerin nasıl çözüldüğü meselesi. Her iki modeli de açıkça uyguladığınızdan emin olursanız, bu sorunla karşılaşmamalısınız. –

    0

    Sınıflar içinde yeni üst düzey sabitler oluşturmak bu hatayı artırır. Sen catalog_presenter.rb böyle bir şey daha istiyorum:

    class MegaMenu 
        class MegaMenu::CatalogPresenter 
        end 
    end 
    
    +0

    Öneri için teşekkürler, Veraticus. Ne yazık ki, bu değişikliği yaptıktan sonra sorun hala var. Rails, uygulama/sunum yapanlara/mega_menu/catalog_presenter.rb'ye bakması gerektiğini bilmiyor gibi görünüyor. – nickh

    +0

    Oh, iyi bir atıştı. :/Yapacağım diğer tek öneri, '' 'app/sunumcuları/mega_menu''' el ile otomatik yükleme yollarına eklemektir ve bunu düzeltip düzeltmediğine bakmaktır. – Veraticus