2017-01-26 35 views
5

örneğinin olarak kayıt değil, ben gibi bir kod vardır şu:Raylar: Alt sınıf I çalışıyorum Rails uygulamasında üst sınıfın

# app/models/a.rb 
class A < ActiveRecord::Base; ...; end 
# app/models/b.rb 
class B < A; ...; end 

# /app/elsewhere... 

do_case(B.new) 

def do_case(letter) 
    case letter 
    when A 
    "not nil" 
    end 
end 

Ben o kadar beklenen ve ben "değil almak gerçekleştirir yerel bu çalıştırdığınızda sıfır "dönüş değeri olarak. Ama test ortamımda nil'u buluyorum.

test ortamı A ataları letter (B.new) arasında (B.ancestors) arasında olduğunu göstermektedir, ama bu durum eşitlik operatörü veya is_a?(A) ile bir alt sınıf olarak kayıt başarısız olur.

A === B.new #=> false in test environment, true locally 
B.new.is_a?(A) #=> false in test environment, true locally 

Bu Raylar autoloading sorun gibi görünüyor, ama ben üst sınıf iki ortamda da atalarının yer alıp almadığını bu yöntemler başarısız olacağını niçin emin değilim. Neler oluyor?

+0

yeniden edilemedi. – Ilya

+0

@Ilya Oldukça eminim ki uygulamadaki diğer birçok sınıfın neden olduğu bir boşaltma sorunu. Burada çoğalmayacak kadar büyük, repoya bağlanmak için çok özel. – steel

+0

Bu, "yay" ile ilgili bir sorun olabilir. 'Spring' kullanıyor musunuz? Eğer öyleyse, önce 'baharı' öldürmeyi dene, sonra testini tekrar dene. Söylediğin gibi, 'case/when'' is_a? 'Çağrılarını kullanmalı ve 'B.new.is_a? (A)' 'true' döndürecektir. – etagwerker

cevap

0

Kabul, bu bir otomatik yükleme sorunu gibi görünüyor. İdeal olmasa da, B numaralı telefondan require_dependency numaralı telefonu ekleyerek sorunu çözebilirsiniz.

Kök sorununun nerede aranacağıyla ilgili olarak, Test ortamınızda bulunmayan test ortamınızda bazı kitaplık bağımlılıklarınız olabilir. Testte bir REPL yükler ve A'u incelerdim. Bazı yararlı yöntem:

class A 
    def self.what_is_my_nesting 
    Module.nesting 
    end 
end 

A.what_is_my_nesting 
A.ancestors 
B.ancestors 

vb

İlgili konular