मॉड्यूल ट्री से xxx की एक प्रति हटा दी गई है लेकिन अभी भी सक्रिय है


129

मुझे पूरा यकीन है कि त्रुटि का TenantIdLoaderमॉड्यूल की वास्तविक सामग्री से कोई लेना-देना नहीं है । इसके बजाय, यह ActiveSupportनिर्भरता के साथ कुछ करना है ।

मुझे यह त्रुटि पिछले नहीं मिल रही है। मैंने जो पढ़ा है, उससे यह है कि या तो ActiveRecord::Baseपुनः लोड हो रहा है या Company::TenantIdLoaderफिर से लोड हो रहा है, और यह किसी भी तरह से संचार नहीं कर रहा है। कृपया मदद करें! मैं वास्तव में रेल 4.2 में अपग्रेड होना चाहूंगा।

संपादित करें

मुझे अब पता चला है कि यह इसलिए है क्योंकि मैं संदर्भित कर रहा हूँ Tenantजो स्वचालित रूप से पुनः लोड हो रहा है। मुझे वास्तव में कक्षा का संदर्भ देने में सक्षम होना चाहिए, इसलिए क्या कोई जानता है कि इसे कैसे प्राप्त किया जाए?

config / application.rb

config.autoload_paths += %W( #{config.root}/lib/company )

config / initializers / company.rb

ActionMailer::Base.send(:include, Company::TenantIdLoader)

lib / कंपनी / tenant_id_loader.rb

module Company
  module TenantIdLoader

    extend ActiveSupport::Concern

    included do
      cattr_accessor :tenant_dependency
      self.tenant_dependency = {}
  
      after_initialize do
        self.tenant_id = Tenant.active.id if self.class.tenant_dependent? and self.new_record? and Tenant.active.present? and !Tenant.active.zero?
      end
    end

    # class methods to be mixed in
    module ClassMethods
  
      # returns true if this model's table has a tenant_id
      def tenant_dependent?
        self.tenant_dependency[self.table_name] ||= self.column_names.include?('tenant_id')
      end
  
    end

  end
end

3
क्या यह उत्तर बिल्कुल मदद करता है? stackoverflow.com/questions/17561697/…
वेन्यू ल्यू

क्या आप सुनिश्चित हैं कि टेनेंट वर्ग शामिल है? यदि आप उस कोड के बिट्स को स्टब करते हैं जो टेनेंट का उपयोग करते हैं तो क्या आपको अभी भी एक त्रुटि मिलती है?
फ्रेडरिक च्युंग

@WaynnLue हाँ मुझे लगता है कि यही कारण है, मुझे नहीं पता कि इसे कैसे ठीक किया जाए।
kddeisz

@FrederickCheung मुझे इस के समान एक और फ़ाइल मिली है जो उसी तरह से गलत है, और यह हमेशा टेनेंट से संबंधित लाइन पर त्रुटी करती है, इसलिए यह मेरा सबसे अच्छा अनुमान है।
kddeisz

1
यद्यपि आप रेल यहाँ Wisper उपयोग नहीं कर रहे हैं, यह टिप्पणी करने के लिए अन्य लोगों के लिए उपयोगी हो सकता है कि Wisper इस समस्या का कारण बनता है काफी लगातार अगर आप इस थ्रेड में सलाह का पालन नहीं करते हैं: stackoverflow.com/questions/28346609/...
स्टीव एन

जवाबों:


182

Tenantएक लाल हेरिंग की तरह है - यदि आप किसी भी ऐप को संदर्भित करते हैं जो रेल की const_missingचाल से लोड करने की आवश्यकता है तो त्रुटि उत्पन्न होगी ।

समस्या यह है कि आप कुछ पुनः लोड करने योग्य (आपका मॉड्यूल) ले जा रहे हैं और फिर इसे फिर से लोड करने योग्य नहीं ( ActiveRecord::Baseया अपने पहले के आसपास ActionMailer::Base) में शामिल कर रहे हैं। कुछ बिंदु पर आपके कोड को फिर से लोड किया गया है और अब ActiveRecord में अभी भी इस मॉड्यूल को इसमें शामिल किया गया है, भले ही रेल को लगता है कि उसने इसे उतार दिया है। त्रुटि तब होती है जब आप टेनेंट को संदर्भित करते हैं, क्योंकि यह const_missingपता लगाने के लिए अपने हुक को चलाने के लिए पटरियों का कारण बनता है, जहां टेनेंट को लोड किया जाना चाहिए और उस कोड से बाहर निकल जाता है क्योंकि मॉड्यूल जहां से निरंतर खोज शुरू हो रही है, वहां नहीं होना चाहिए।

3 संभावित समाधान हैं:

  1. अपने मॉड्यूल को गैर-लोड करने योग्य कक्षाओं में बंद करें - या तो व्यक्तिगत मॉडल में शामिल करें, आवश्यकतानुसार नियंत्रक या एक सार आधार वर्ग बनाएं और मॉड्यूल को वहां शामिल करें।

  2. इस मॉड्यूल को गैर-लोड करने योग्य बनाएं, इसे कहीं और संग्रहीत करें जो autoload_paths में नहीं है (आपको इसे स्पष्ट रूप से आवश्यक करना होगा क्योंकि रेल अब आपके लिए इसे जादुई रूप से लोड नहीं करेगी)

  3. किरायेदार को बदलना :: किरायेदार ( Object.const_missingतब आमंत्रित किया जाएगा, नहीं Tenant.const_missing)


30
मुझे लगता है कि एक तीसरा समाधान मिल गया है, हालांकि मैं सोच रहा था कि क्या आप जानते हैं कि यह क्यों काम करता है। अगर मैं इसका संदर्भ देता तो :: किरायेदार, सब कुछ जादुई तरीके से काम करता है। संभवतः क्योंकि यह तब इसे एक शीर्ष-स्तरीय स्थिरांक के रूप में लोड कर रहा है? शायद?
kddeisz

3
तब यह Object.const_missing है जिसे आपका YourDodule.const_missing नहीं कहा जाएगा। इसलिए चीजों को काम करना चाहिए
Frederick Cheung

6
::मेरे लिए काम करते हुए टॉप-लेवल का समर्थन भी!
एलेक्स मूर-नीमी

7
मेरे पास यह मुद्दा समय-समय पर आ रहा था और मेरे मामले में यह वसंत से संबंधित था, इसलिए कर ./bin/spring stopइसे हल कर रहा था।
santuxus

2
I LOVE कि यह एक रनटाइम रूबी / रेल त्रुटि है - किसी भी अन्य भाषा के विपरीत, गतिशील या नहीं, रूबी डेवलपर्स को वास्तविक असीमित लचीलापन देता है जिसका शाब्दिक रूप से कोई विचार नहीं है जहां आपके कार्यक्रम के क्रियान्वयन तक मॉड्यूल परिभाषित होते हैं (और यह किस क्रम में निष्पादित होता है)। यह इतनी अच्छी तरह से डिजाइन किया गया है।
एंडी रे


6

यकीन नहीं होता कि यह किसी की मदद करेगा, लेकिन मुझे यह अचानक एक बदलाव के बाद शुरू हुआ जो असंबंधित लग रहा था। एप्लिकेशन सर्वर को पुनरारंभ करने के बाद यह चला गया।


0

मेरे लिए इस मुद्दे ModuleNameको 'ModuleName'.constantizeहल करने के लिए बदल रहा है ।


0

मेरे लिए क्या काम किया:

को अपडेट config.eager_load = falseकरेंtrue

में config/environments/development.rb

रूबी 2.6.5
रेल 5.1.6


1
हाँ निश्चित रूप से ऐसा नहीं करते। यह विकास में कोड को फिर से लोड करने की आपकी क्षमता को मारने वाला है।
kddeisz

-13

कभी-कभी आप बस

अपने सर्वर को पुनरारंभ करें,


मुझे समझ नहीं आ रहा है कि इस उत्तर को क्यों ठुकराएँ? दोहराने का मतलब है कि यह महत्वपूर्ण है! क्यों साधारण चीजों में बहुत बकवास है?
Albert.Qing 13

7
इसे डाउनवोट किया गया है क्योंकि (ए) कोई फर्क नहीं पड़ता कि आप कितनी बार अपने सर्वर को पुनरारंभ करते हैं यह मूल प्रश्न में समस्या को हल नहीं करेगा, और (बी) आपको बस एक समस्या के लक्षणों का इलाज नहीं करना चाहिए, लेकिन समस्या खुद।
tjbp

@tjbp plz "कभी-कभी" शब्द के बारे में सावधान?
Albert.Qing

समस्या यह है कि विकास मोड में एप्लिकेशन को डीबग करना असंभव है यदि आपको प्रत्येक परिवर्तन के बाद सर्वर को पुनरारंभ करना है।
मैक्स इवाक

2
मैं इस उत्तर के लिए मतदान करूंगा क्योंकि यदि आप मोंगॉयड का उपयोग कर रहे हैं और ऑब्जेक्ट एक्स को रेल कंसोल से हटाते हैं, तो आपको यह त्रुटि मिलेगी: A copy of X has been removed from the module tree but is still activeउन सभी पृष्ठों पर, जिनके पास ऑब्जेक्ट है Y.embeds X, और सर्वर को पुनरारंभ करना वास्तव में इस विशिष्ट मामले के लिए काम करता है। लेकिन आपको अपना उत्तर संपादित करना चाहिए।
लुकास एंड्रेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.