2017-01-26 13 views
5

के कहने मैं में काम कर रहा हूँ एक रेल ऐप्लिकेशन में के रूप में पंजीकरण नहीं, मैं की तरह कोड है निम्नलिखित:रेल: उपवर्ग माता पिता वर्ग

# 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 

जब मैं इस स्थानीय रूप से चलाने के रूप में की उम्मीद करता है और मैं नहीं मिल " शून्य "वापसी मूल्य के रूप में। लेकिन मुझे अपने परीक्षण वातावरण में nil मिल गया है।

परीक्षण वातावरण से पता चलता है कि A पूर्वजों letter (B.new) की (B.ancestors) के बीच है, लेकिन मामले समानता ऑपरेटर या is_a?(A) के साथ एक उपवर्ग के रूप में रजिस्टर करने के लिए विफल रहता है।

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

यह एक रेल autoloading मुद्दे की तरह लगता है, लेकिन मुझे यकीन है कि क्यों इन तरीकों अगर माता पिता वर्ग दोनों परिवेशों में पूर्वजों में शामिल है में नाकाम रहने की जाएगी नहीं हूँ। क्या चल रहा है?

+0

पुन: पेश नहीं कर सका। – Ilya

+0

@Ilya मुझे यकीन है कि यह एप्लिकेशन में कई अन्य वर्गों के कारण एक ऑटोलोडिंग समस्या है। रेपो से जोड़ने के लिए यहां बहुत निजी, पुन: पेश करने के लिए बहुत बड़ा है। – steel

+0

यह संभवतः 'वसंत' के साथ एक मुद्दा है। क्या आप 'वसंत' का उपयोग कर रहे हैं? यदि ऐसा है, तो पहले 'वसंत' को मारने का प्रयास करें, फिर अपने परीक्षण को फिर से प्रयास करें। जैसा कि आपने कहा था, 'if_a?' कॉल का उपयोग करना चाहिए और 'bnew.is_a? (ए) '' सत्य' वापस कर देगा – etagwerker

उत्तर

0

सहमत हैं, यह एक ऑटोलोडिंग समस्या की तरह दिखता है। आदर्श नहीं होने पर, आप इसे require_dependencyB में कॉल करके इसे हल कर सकते हैं।

जहां तक ​​रूट समस्या की तलाश है, यह संभव है कि आपके परीक्षण वातावरण में कुछ पुस्तकालय निर्भरताएं हों जो परीक्षण पर मौजूद न हों। मैं टेस्ट पर एक आरईपीएल लोड करूंगा और A का निरीक्षण करूंगा। कुछ उपयोगी तरीके:

class A 
    def self.what_is_my_nesting 
    Module.nesting 
    end 
end 

A.what_is_my_nesting 
A.ancestors 
B.ancestors 

आदि

संबंधित मुद्दे