2013-05-15 14 views
8

:Rails almaya bağımlılık alt sınıfları gerektir ben kurulum şu var

app/modeller/my_module/service.rb

module MyModule 
    class Service < ActiveRecord::Base 
    def self.types 
     self.subclasses 
    end 

    def self.raw_types 
     self.types.map { |c| c.name.split("::").last } 
    end 
    end 
end 

require_dependency "my_module/service/rack" 
require_dependency "my_module/service/rails" 
require_dependency "my_module/service/sinatra" 

app/modeller/my_module/hizmet/rack.rb:

module MyModule 
    class Service::Rack < Service 
    end 
end 

app/modeller/my_module/hizmet/rails.rb:

module MyModule 
    class Service::Rails < Service 
    end 
end 
Şimdiye kadar çalışır

module MyModule 
    class Service::Sinatra < Service 
    end 
end 

, ama şimdi benim sorum:: 10

app/modeller/my_module/hizmet/sinatra.rb

require_dependency "my_module/service/rack" 
require_dependency "my_module/service/rails" 
require_dependency "my_module/service/sinatra" 
:

Neden bu üç satırları eklemek zorunda Service.rb dosyama

?

Üç satırları ekleyin yoksa:

MyModule::Service.raw_types 
=> ["Rack", "Rails", "Sinatra"] 

Herkes bir fikir: Üç satırları eklerseniz

MyModule::Service.raw_types 
=> [] 

?

Btw: Her zamanki de geliştirme ortamında, raylar olacak özdevinimli_yükle sabitleri Ruby 2.0.0-preview1 kullanmak 4.0.0.rc1 Raylar ve Varsayılan olarak

rails plugin new MyModule 
+0

mu MyModule bunları gerektiren gerekir :: Service.types çalışır? –

+0

Dosyaların neden gerektirdiği veya dizinin neden doldurulduğu sorusu var mı? Dosyalara ihtiyacınız olduğunda, tüm alt sınıf Hizmetlerini içeren 3 sınıf eklediğinizden, 'Service.subclasses' bu 3 sınıfı döndürür. – Kris

+0

Fikir: bir dosya maymun-yamaların alt sınıfları Sınıf içine yamalar. – User

cevap

12

ile yeni Raylar motoru oluşturmak geleneksel yere bakarak app'un alt dizinleri (ör. MyModule::Service::Rack için /app/models/my_module/service/rack.rb). Bu otomatik yükleme, sabitleme ilk kez başvurulduğunda, uygulama başlatılmasında değilken gerçekleşir.

Ancak bu, sabit referans alınmadan önce, açıkça tanımlanmadıkça onu tanımlayan dosyanın yüklenmediği anlamına gelir. Bu nedenle, MyModule::Service.raw_types numaralı telefonu aradığınızda, MyModule::Service, zaten tanımlanmamışsa app/models/my_module/service.rb'dan yüklenir. Ancak, alt sınıflarına henüz herhangi bir referans yapılmadıysa, bu sabitler,, bunları tanımlayan dosyalar açıkça belirtilmedikçe olarak tanımlanmayacaktır. Böylece, bu dosyada numaralı dosyada otomatik olarak yüklenen dosyaların bulunmasını gerektirir.

ahlaki: MyModule::Service alt sınıfları hep MyModule::Service olduğunda tanımlanmış olduğundan emin olmak için isterseniz /app/models/my_module/service.rb

+0

Zaten bunu düşündüm, ama Raylar, yöntem çağrılırken otomatik yüklemeyi düzeltir, çünkü sınıflar bir üst sınıf yöntem çağrısı ile gereklidir çünkü Rails hatası olabilir mi? Bir "ruby view" dan yükleme anlıyorum, ama "raylar görünümü" dan değil .. – Mattherick

+2

Bu Rails bir hata değildir. Uygulamanın, var olduklarını bile bilmediğinde bu sabitlerin gerekli olduğunu bilmesi nasıl gerekir? Alt sınıflarınızı, süper sınıfı tanımlayan dosyada gerektirecek bir zarar olduğunu düşünmüyorum. Alternatif olarak, hepsini app/initial.rb içine yükleyebilirsin, böylece uygulama başlatılırken orada olacaklar. – gregates

+0

Ancak Rails böyle bir davranış varsa, alt sınıflar tanımlanmış alt sınıflar olup olmadığını kontrol etmek için üst sınıf etrafında modül gibi çağrılan alt klasörü ararsa, çok iyi olurdu. Bu harika olurdu :). Ama yine de hepsini rayların başlangıç ​​süreci boyunca yükleyeceğim. Açıklama için – Mattherick

İlgili konular