2010-10-23 12 views
12

मैं रूबी 1.9 के साथ काम करने के लिए अपने रेल एप्लिकेशन उन्नयन कर रहा हूँ और मैं इस तरह का सामना त्रुटियों रखें:"बेनामी मॉड्यूल का कोई नाम नहीं होना चाहिए" वास्तव में क्या मतलब है?

Anonymous modules have no name to be referenced by 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:585:in `to_constant_name' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:391:in `qualified_name_for' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:104:in `rescue in const_missing' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:94:in `const_missing' 
/home/foo/app/config/environment.rb:66:in `block in <top (required)>' 
etc. 

Google इस के लिए हिट के सभी प्रकार पाता है, लेकिन उनमें से हर एक विशिष्ट के लिए एक विशिष्ट ठीक से संबंधित है मणि या ऐप। उनमें से कोई भी समझाता है कि संदेश वास्तव में क्या मतलब है।

  • क्या एक "गुमनाम मॉड्यूल" क्या है?
  • यह त्रुटि संदेश कहां से आ रहा है? (रूबी दुभाषिया स्वयं?)
  • रुबी 1.9 के बारे में क्या अलग है जो इसका कारण बनता है? (रुबी 1.8.7 के साथ रेल 2.3.8 इसका सामना नहीं करता है।)
  • इस त्रुटि को ठीक करने का सामान्य/उचित तरीका क्या है?

environment.rb रेखा 66 super_exception_notifier के लिए विन्यास है (पुराना संस्करण, 2.0.8):

ExceptionNotifier.configure_exception_notifier do |config| 
    config[:sender_address] = %("Foo" <[email protected]>) 
    config[:exception_recipients] = %w([email protected]) 
    config[:skip_local_notification] = false 
end 

मैं क्या बता सकते हैं, ExceptionNotifier अपरिभाषित है, और ActiveSupport जादुई लोड करने के लिए कोशिश कर रहा है यह, लेकिन विफल रहता है और फिर एक अच्छा त्रुटि संदेश मुद्रित करने की कोशिश कर रहा है।

+0

रेल के साथ अपने ऐप में विधि/मॉड्यूल नामों में नाम टकराव की जांच करें। जब आपकी कोड सामग्री एआर के साथ टकराती है तो अस्पष्ट त्रुटियां अक्सर होती हैं। असफल कोड शामिल करने के लिए – glebm

उत्तर

6

एक अनाम मॉड्यूल एक मॉड्यूल है कि इतनी तरह की घोषणा की है:

Fred = Module.new do 
    def meth1 
    "hello" 
    end 
    def meth2 
    "bye" 
    end 
end 

के बजाय नियमित Module mod_name <block> वाक्य रचना का उपयोग करके। चूंकि उनके पास कोई मॉड्यूल नाम नहीं है, इसलिए आप मॉड्यूल नाम पुनर्प्राप्त नहीं कर सकते हैं। to_constant_namedesc.name.blank? पर कॉल करने का प्रयास कर रहा है जहां desc एक अज्ञात मॉड्यूल है (name के साथ)।

यह त्रुटि ActiveSupport मॉड्यूल से आ रही है, जो सक्रिय_support मणि में एक बग इंगित कर सकती है या संकेत दे सकती है कि कोड का कुछ अन्य भाग गलत समर्थन का उपयोग कर रहा है। अकेले त्रुटि संदेश अपराधी की पहचान करने के लिए पर्याप्त जानकारी नहीं देता है (कम से कम मेरे लिए, अधिक रेल अनुभव वाले किसी व्यक्ति को अधिक अंतर्दृष्टि प्रदान करने में सक्षम हो सकता है)।

अपमानजनक कोड को जानने के बिना यह कहना मुश्किल है कि यह त्रुटि 1.9 के साथ क्यों आ रही है, या इसे ठीक करने के लिए क्या करने की आवश्यकता है। इस बात पर विचार करते हुए कि वहां बहुत सारे अन-और बनाए रखे हुए रत्न हैं जिन्हें अभी तक 1.9 के लिए अपडेट नहीं किया गया है, मुझे संदेह होगा कि ActiveSupport समस्या का स्रोत नहीं है। अपने सभी रत्नों को अपग्रेड करें जिनमें 1.9-संगत संस्करण हैं, और फिर एक बार में अपने अन्य रत्नों को अक्षम करने का प्रयास करें (यदि आप कर सकते हैं) और देखें कि क्या आपको अभी भी त्रुटि मिलती है या नहीं।

यदि आप अन्य रत्नों की एक सूची प्रदान करते हैं जिनका उपयोग आप कर रहे हैं, तो कोई और जो पहले त्रुटि का सामना कर सकता है, कुछ विवरण प्रदान करने में सक्षम हो सकता है।

3

यदि आप ActiveRecord की आंतरिक कक्षा और मॉड्यूल संदर्भों को गलत तरीके से उपयोग करने का प्रयास करते हैं तो ऐसा हो सकता है। कल एक गम पर काम करते हुए मुझे यह त्रुटि मिली जो ActiveRecord के गहरे आंतरिक कार्य को बढ़ाती है। अंत में मैं अपने कोड को फिर से डिजाइन करके इस समस्या को हल करने में कामयाब रहा जो आंतरिक संदर्भों का शोषण करता है। आगे विश्लेषण के लिए environment.rb:66 की आसपास की रेखाओं को देखना दिलचस्प होगा।

+0

संपादित प्रश्न। – ScottJ

0

जब मुझे यह त्रुटि मिली, तो यह कक्षा को परिभाषित करते समय गलत वर्तनी के कारण था। यदि आपको यह त्रुटि मिल रही है, तो यह आपके मॉड्यूल और टाइपो के लिए कक्षा परिभाषाओं की जांच करने योग्य हो सकती है।

+0

किंडा देर से पार्टी के लिए, मुझे पता है, लेकिन अन्य उत्तरों (जानकारीपूर्ण) वास्तव में जांच शुरू करने के लिए विशिष्ट वस्तुओं से संबंधित सलाह नहीं देते हैं। –

1

यह तब हो सकता है जब कक्षा का नाम फ़ाइल नाम से मेल नहीं खाता है, में मेरा मामला यह application.rb नामक फ़ाइल था जिसे एप्लिकेशन नियंत्रक वर्ग का विरोध किया गया था। File_controller.rb पर फ़ाइल का नाम बदलने से समस्या हल हो गई।