2010-09-08 12 views
19

जब मेरे कार्यात्मक परीक्षण चल रहा है, मैं परीक्षण मामलों में से एक में निम्न चेतावनी हो रही है, लेकिन मैं नहीं बता सकता कि वह कहाँ से आ रहा है:ट्रेस स्रोत परीक्षण

gems/actionpack-2.3.8/lib/action_controller/record_identifier.rb:76: warning: Object#id will be deprecated; use Object#object_id

दुर्भाग्य से यह दिखाया गया बैकट्रैक की एकमात्र पंक्ति है, भले ही मैं इसे rake test --trace के साथ चलाता हूं, और log/test.log में कोई और जानकारी नहीं है।

मैं इस चेतावनी के लिए पूर्ण बैकट्रैक कैसे प्राप्त कर सकता हूं या अन्यथा यह पता लगा सकता हूं कि मेरे कोड में कौन सी रेखा इसका कारण बन रही है?

उत्तर

33

इसे हल करने के लिए आप पूर्ण डीबगिंग जानकारी सक्षम कर सकते हैं। (see the help)

ActiveSupport::Deprecation.debug = true 

@Eric एंडरसन कहते हैं यह रेल भार के बाद रखा जाना चाहिए (अर्थात application.rb में require 'rails/all' के बाद), लेकिन इससे पहले कि बंडलर जवाहरात में समाप्त चेतावनी को पकड़ने के लिए चलाता है (अर्थात application.rb में Bundler.require(:default, Rails.env) if defined?(Bundler) से पहले)।

आप अपने config में इस छोड़ने के लिए if ENV["DEBUG"] या if environment == :test की तरह एक शर्त जोड़ सकते हैं।

1

जब मुझे अपने परीक्षणों में इस प्रकार की चेतावनी मिलती है तो आमतौर पर ऐसा होता है क्योंकि मैं मॉडल ऑब्जेक्ट्स का मज़ाक उड़ा रहा हूं और सक्रिय रूप से वास्तविक रिकॉर्ड प्रदान करने वाली सभी विधियों को प्रदान नहीं कर रहा हूं।

एक अच्छा प्रारंभिक बिंदु रेल कोड स्वयं ही होगा। action_pack मणि के लिए स्रोत कोड को देखते हुए संदर्भित किया गया है, त्रुटि उत्पन्न करने वाली विधि dom_id है। वह विधि किसी ऑब्जेक्ट के लिए किसी पृष्ठ पर उपयोग के लिए आईडी उत्पन्न करती है। ऐसा लगता है कि आंतरिक रूप से कुछ स्थानों में कहा जाता है (जब तक कि आप इसे सीधे तौर पर कॉल नहीं कर रहे हों!) लेकिन किसी ऑब्जेक्ट पर सबसे अधिक संभावित कारण form_for पर कॉल किया जा रहा है।

+1

मैं विशेष रूप से इस त्रुटि के लिए अधिक सामान्य उत्तर की उम्मीद कर रहा था, लेकिन यह समझ में आता है: रेल स्रोत के माध्यम से कदम उठाने के ठीक वही था जो मैं कर रहा था; यह शायद ऐसा करने का एकमात्र तरीका है। मैंने एक ब्रेकपॉइंट जोड़ा जब तक record.kind_of? (ActiveRecord :: Base) 'उस लाइन के ऊपर एक्शनपैक में नहीं है, इसलिए मैं 'कहां' कह सकता हूं और पूर्ण ढेर प्राप्त कर सकता हूं। (यह एक 'content_tag_for' था ...) –

+0

ठीक है, मैं देखता हूं। मैं रेल कोड में कदम उठाने और वापस काम करने के अलावा कोई और जानकारी प्राप्त करने का एक तरीका नहीं समझ पाया। अगर आप जो चाहते थे उसका उत्तर नहीं देते तो आपको मेरा जवाब स्वीकार नहीं करना पड़ेगा! – Shadwell

7

एक ही समस्या थी। एक मणि एक बहिष्कार चेतावनी पैदा कर रहा था, लेकिन मुझे नहीं पता था कि रेल का संदेश केवल मेरे कोड में कॉलस्टैक का आखिरी बिट दिखाता है। निम्नलिखित जोड़ें:

module ActiveSupport::Deprecation 
    class << self 
    def deprecation_message_with_debugger(callstack, message = nil) 
     debugger 
     deprecation_message_without_debugger callstack, message 
    end 
    alias_method_chain :deprecation_message, :debugger 
    end 
end 

रेल लोड करने के बाद इस रखा है (यानी application.rb में require 'rails/all' के बाद), लेकिन इससे पहले कि बंदर जवाहरात में समाप्त चेतावनी को पकड़ने के लिए चलाता है (अर्थात application.rb में Bundler.require(:default, Rails.env) if defined?(Bundler) से पहले)।

अब जब एक बहिष्करण चेतावनी का सामना करना पड़ता है तो आपको डीबगर में गिरा दिया जाता है। आप या तो इसे छोड़ सकते हैं (और if Rails.env.test? के साथ घूमते हैं) या जब आपको अपने मुद्दे मिलते हैं तो इसे हटा दें।

+1

एक उचित समाधान की तरह लग रहा है। मैं खुद को चकित कर रहा हूं क्योंकि रेल 5 की रिलीज के साथ, 'alias_method_chain' खुद को बहिष्कृत कर दिया गया है। मुझे लगता है कि 'alias_method_chain' का उपयोग करने के लिए' alias_method_chain' का उपयोग करना ठीक है – Nathan

+0

आप मॉड्यूल # अब प्रीपेड कर सकते हैं। –

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