रूबी में किसी ऑब्जेक्ट के लिए सभी तरीकों को कैसे सूचीबद्ध किया जाए?


112

मैं उन सभी तरीकों को कैसे सूचीबद्ध करूं, जिनकी किसी विशेष वस्तु तक पहुंच है?

मेरे पास एक @current_userऑब्जेक्ट है, जो एप्लिकेशन कंट्रोलर में परिभाषित है:

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

और यह देखना चाहता हूं कि मेरे पास व्यू फाइल में कौन से तरीके उपलब्ध हैं। विशेष रूप से, मैं देखना चाहता हूं कि :has_manyसंघ क्या तरीके प्रदान करता है। (मुझे पता है कि क्या प्रदान :has_many करना चाहिए , लेकिन वह जांचना चाहता है।)


स्पष्ट करने के लिए, आप तरीकों को कॉल करने योग्य @current_userचाहते हैं?
एंड्रयू मार्शल

@Dirk, stackoverflow में आपका स्वागत है! उस उत्तर को "जांचना" याद रखें जो आपके प्रश्न का सबसे अच्छा उत्तर देता है। इसके अलावा किसी भी सवाल का जवाब दें, जो आपको उपयोगी / उपयोगी लगे।
लैरी के

जवाबों:


210

निम्नलिखित उन तरीकों को सूचीबद्ध करेगा जो उपयोगकर्ता वर्ग के पास है कि आधार ऑब्जेक्ट वर्ग के पास नहीं है ...

>> User.methods - Object.methods
=> ["field_types", "maximum", "create!", "active_connections", "to_dropdown",
    "content_columns", "su_pw?", "default_timezone", "encode_quoted_value", 
    "reloadable?", "update", "reset_sequence_name", "default_timezone=", 
    "validate_find_options", "find_on_conditions_without_deprecation", 
    "validates_size_of", "execute_simple_calculation", "attr_protected", 
    "reflections", "table_name_prefix", ...

ध्यान दें कि methodsकक्षाओं के लिए और कक्षा उदाहरणों के लिए एक विधि है।

यहाँ वो विधियाँ हैं जो मेरे उपयोगकर्ता वर्ग में हैं जो ActiveRecord बेस क्लास में नहीं हैं:

>> User.methods - ActiveRecord::Base.methods
=> ["field_types", "su_pw?", "set_login_attr", "create_user_and_conf_user", 
    "original_table_name", "field_type", "authenticate", "set_default_order",
    "id_name?", "id_name_column", "original_locking_column", "default_order",
    "subclass_associations",  ... 
# I ran the statements in the console.

ध्यान दें कि (कई) has_many रिश्तों के परिणामस्वरूप बनाए गए तरीके उपयोगकर्ता वर्ग में परिभाषित कॉल के परिणामों में नहीं हैं methods

जोड़ा गया नोट: has_many विधियों को सीधे नहीं जोड़ता है। इसके बजाय, ActiveRecord मशीनरी मक्खी पर विधि कॉल को संभालने के लिए रूबी method_missingऔर responds_toतकनीकों का उपयोग करती है। परिणामस्वरूप, methodsविधि विधि परिणाम में सूचीबद्ध नहीं हैं ।


2
हालाँकि यह पूरा नहीं हो सकता है क्योंकि कुछ विधियाँ केवल तभी बनाई जाती हैं जब method_missing कहा जाता है (जैसे डायनेमिक खोजक)
फ्रेडरिक च्युंग

अगर मैं प्रतिसाद दे रहा हूँ_तो? मुझे एक विधि अनुपलब्ध त्रुटि मिलती है। मैं इसे अंदर दे रहा हूं application.html.erb
डिर्क

@Dirk - शायद विधि मौजूद नहीं है ... मेरा सुझाव है कि आप एक नया प्रश्न दर्ज करें जहां आप दिखाते हैं कि आपकी एआर कक्षा की परिभाषाएं क्या हैं और फिर उन विशिष्ट तरीकों के बारे में पूछें जो आपको लगता है: has_many प्रदान करना चाहिए। क्या आपके पास भी मेल है: अंतर्गत_तो? एआर के लिए रेल्स के कैपिटलाइज़ेशन और बहुवचन नियमों ने कई भटकावों का नेतृत्व किया है ...
लैरी के

@Larry। धन्यवाद - मैं .to_yaml के साथ एक सूची प्राप्त कर सकता हूं। यह इस तरह दिखता है: --- -: स्केच -: स्केच_साइड -: स्केच = -: स्केच_एड्स = -: इससे पहले_डेड_फोर्स_चेस्चेस: - इससे पहले_डेड_फोर्स_चेस्? <कई लोप हो गए ...... ...... मैं उन तरीकों का उपयोग कैसे करूं? (मुझे प्रलेखन की ओर इशारा करते हुए भी सराहना मिली :)
डिर्क

इसके लिए डॉक्स : has_many कई तरीकों को दिखाता है जो जोड़े जाते हैं। अन्य रेल के बाद के संस्करणों के लिए नए हैं। इनमें "पहले_अदाल_मान" आदि शामिल हैं। वे "एसोसिएशन कॉलबैक" हैं - इस डॉक्टर के
लैरी के

9

मॉड्यूल # instance_methods

रिसीवर में सार्वजनिक और संरक्षित उदाहरण विधियों के नाम युक्त एक सरणी देता है। एक मॉड्यूल के लिए, ये सार्वजनिक और संरक्षित तरीके हैं; एक वर्ग के लिए, वे उदाहरण (सिंगलटन नहीं) विधियाँ हैं। बिना किसी तर्क के, या एक तर्क के साथ जो कि गलत है, मॉड में उदाहरण के तरीके वापस आ जाते हैं, अन्यथा मॉड और मॉड के सुपरक्लास में तरीके वापस आ जाते हैं।

module A
  def method1()  end
end
class B
  def method2()  end
end
class C < B
  def method3()  end
end

A.instance_methods                #=> [:method1]
B.instance_methods(false)         #=> [:method2]
C.instance_methods(false)         #=> [:method3]
C.instance_methods(true).length   #=> 43





1

@ Clyfe के उत्तर को उजागर करने के लिए। आप निम्न कोड का उपयोग करके अपने उदाहरण के तरीकों की एक सूची प्राप्त कर सकते हैं (यह मानते हुए कि आपके पास "Parser" नामक एक ऑब्जेक्ट क्लास है):

Parser.new.methods - Object.new.methods

1

यदि आप उन विधियों की सूची देख रहे हैं, जो एक उदाहरण (आपके मामले में @current_user) का जवाब देती हैं। माणिक प्रलेखन विधियों के अनुसार

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

@current_user.methods
@current_user.methods(false) #only public and protected singleton methods and also array will not include methods in modules included in @current_user class or parent of it.

वैकल्पिक रूप से, आप यह भी देख सकते हैं कि एक विधि किसी वस्तु पर कॉल करने योग्य है या नहीं।

@current_user.respond_to?:your_method_name

यदि आप पैरेंट क्लास के तरीके नहीं चाहते हैं, तो सिर्फ पैरेंट क्लास के तरीकों को उसमें से घटाएँ।

@current_user.methods - @current_user.class.superclass.new.methods #methods that are available to @current_user instance.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.