'Response_to' बनाम 'response_to?' के बारे में उलझन में


79

मैं Railstutorial.org के साथ रेल सीख रहा हूं, और मैं कुछ के बारे में उलझन में हूं: इस अध्याय में लेखक हमें respond_to?किसी उपयोगकर्ता ऑब्जेक्ट पर विधि के साथ कंसोल में कुछ परीक्षण करने के लिए कहता है , और यह ठीक काम करता है। लेकिन बाद में, जब हम :encrypted_passwordविशेषता के लिए परीक्षण लिखते हैं , तो वह उपयोग करता है respond_to

जिज्ञासा से बाहर, मैंने respond_toकंसोल में, एक उपयोगकर्ता ऑब्जेक्ट के लिए कोशिश की , और मुझे एक त्रुटि मिलती है जिसमें कहा गया है कि विधि मौजूद नहीं है। काश, अगर मैं respond_to?इसके बजाय परीक्षण का उपयोग कर लिखने की कोशिश करता respond_to, तो परीक्षण नहीं चलता।

क्या कोई मुझे अंतर समझा सकता है, और परीक्षण केवल साथ क्यों चलता है respond_to?

जवाबों:


171

रूबी व्यवहार करता है ?और !एक विधि के नाम पर ही वास्तविक पात्रों। respond_toऔर respond_to?अलग हैं। ?इंगित करता है कि यह एक सही या गलत (सम्मेलन द्वारा) का जवाब देना चाहिए , यह कोई आवश्यकता नहीं है)। विशेष रूप से:

respond_to?यह पता लगाने के लिए एक रूबी विधि है कि क्या उस पर एक विशेष विधि है। उदाहरण के लिए,

@user.respond_to?('eat_food')

यदि Userकक्षा इस पर एक eat_foodविधि रखती है तो यह सच होगा ।

respond_toविशेष अनुरोध प्रकारों का जवाब देने के लिए एक रेल विधि है । उदाहरण के लिए:

def index
  @people = Person.find(:all)

  respond_to do |format|
    format.html
    format.xml { render :xml => @people.to_xml }
  end
end

हालाँकि, आपके द्वारा दिए गए RailsTutorial लिंक में, आप RSpec विधि shouldको RSpec की respond_toविधि के साथ इंटरैक्ट करते हुए देख रहे हैं । यह आपके कंसोल में उपलब्ध नहीं होगा, जब तक कि आप नहीं चलते rails console test


लेकिन यदि आप पुस्तक में उदाहरण पढ़ते हैं, तो answer_to का उपयोग अनुरोध प्रकार के साथ नहीं किया जाता है, बल्कि एक विशेषता के साथ किया जाता है। हो सकता है कि रूबी रूबी पद्धति को ओवरराइड करती है इसलिए यह भी विशेषताओं को स्वीकार करती है?
Agente_secreto

1
यह परीक्षण के लिए एक RSpec विधि है: rspec.info/documentation ... यह कंसोल में तब तक उपलब्ध नहीं होगा जब तक आप ENV को परीक्षण के लिए सेट नहीं करते।
टिम सुलिवान

3
मुझे लगता है कि यह वास्तव में अजीब है कि रूबी रचनाकारों ने दो अलग-अलग चीजों के लिए एक ही कथन नाम "response_to" का उपयोग करने का निर्णय लिया: पता चलता है कि क्या कोई वस्तु एक विधि है या एक अनुरोध प्रकार का जवाब है। अरे हाँ, वहाँ एक है? जो उन्हें अलग बनाता है। वाह। \
_

4
यह रूबी निर्माता बिल्कुल भी नहीं था। पहली एक रूबी विधि है। दूसरा ActionController पर एक रेल विधि है। तीसरा एक RSpec पुस्तकालय विधि है। ? तथा ! रूबी में महत्व है, तो response_to और response_to के बीच का अंतर? ट्रिम और ट्रिम के बीच अंतर के बराबर हैं।
टिम सुलिवन

2
नवीनतम भविष्य के उपयोगकर्ता भ्रमित हो सकते हैं, ?रूबी में एक विधि के नाम के अंत में यह गारंटी नहीं है कि विधि एक बूलियन वापस कर देगी। ?विधि नाम का कोई हिस्सा, किसी अन्य चरित्र की तरह है। प्रश्न चिह्न विधियों को एक बूलियन को वापस करना चाहिए एक अच्छी तरह से स्थापित सम्मेलन है, लेकिन यह सार्वभौमिक रूप से पालन नहीं किया जाता है। (उदाहरण के लिए देखें github.com/rails/rails/pull/5329 और जब एक प्रश्न चिह्न विधि ने एक बूल वापस नहीं किया तो हंगामा हुआ)
एंड्रयू

4

respond_to?एक बूलियन मूल्यांकन है। respond_to(सामान्य रूप से) प्रदर्शन जानकारी निर्धारित करने के लिए प्रयोग किया जाता है। अधिक जानकारी यहाँ । यह respond_to?देखने के लिए कि क्या कोई विधि मौजूद है और यदि वह सही है या नहीं तो सही है या नहीं।


3

परीक्षण अधिक उपयोगकर्ता के अनुकूल होने के लिए सुविधाजनक सहायकों का उपयोग करता है।

रूबी रूबी है इसलिए अच्छे पुराने का उपयोग respond_to?करना काम करेगा यदि आप इसे इस तरह कहते हैं:

 @user.respond_to?(:encrypted_password).should be_true

respond_toनियंत्रकों में एक और उपयोग किया जाता है लेकिन फिर भी उन लोगों के साथ कुछ नहीं करना है जो आप पहले से ही मिले थे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.