रेल से जवाब दिया जाता है: यह कैसे काम करता है?


128

मैं यहाँ और वहाँ के बारे में पढ़ रहा हूँ कि कैसे respond_withविधि 3 में शांत है । लेकिन मैं भी इसे एक संदर्भ या तो एपीआई एपीआई या स्रोत खोज से नहीं मिल सकता है। क्या कोई भी मुझे समझा सकता है कि यह कैसे काम करता है (आप कौन से विकल्प का उपयोग कर सकते हैं, आदि) या मुझे उस स्थान पर इंगित करें जो वास्तव में लागू किया गया है इसलिए मैं अपने दम पर कोड को मना कर सकता हूं?

जवाबों:


128

रेल के लिए अद्यतन 4.2+

#respond_withऔर ::respond_to( nb वर्ग विधि) अब रेल का हिस्सा नहीं हैं । उन्हें रेल पार्टी के उत्तरदाता मणि में रेल 4.2 ( रिलीज नोट्स / कमिट) के रूप में माइग्रेट किया गया था दिनांक 2014 अगस्त) के । जबकि उत्तरदाताओं को डिफ़ॉल्ट रूप से रेल में शामिल नहीं किया गया है, यह डेविस की निर्भरता है, और इस प्रकार कई रेल अनुप्रयोगों में उपलब्ध है।

#respond_to उदाहरण के विधि, तथापि, अभी भी रेल का एक हिस्सा (5.2rc1 इस लेखन के रूप में)।

ActionController::MimeRespondsकैसे #respond_toकाम करता है के लिए आधिकारिक रेल एपीआई प्रलेखन बताते हैं । मूल रेल गाइड मार्गदर्शिकाएँ के लिए टिप्पणियाँ टिप्पणियाँ #respond_withऔर ::respond_toअभी भी उत्तरदाताओं मणि स्रोत कोड में पाया जा सकता है ।


मूल उत्तर

उत्तरदाताओं के लिए कोड एक वर्ग और एक मॉड्यूल में आधारित है। MimeResponds जो ActionController :: Base में शामिल है , जिस वर्ग से आपकी ApplicationControllerविरासत है। फिर ActionController :: Responder है जो response_with का उपयोग करते समय डिफ़ॉल्ट व्यवहार प्रदान करता है।


डिफ़ॉल्ट रूप से, प्रतिक्रिया में प्रदान किया जाने वाला एकमात्र व्यवहार रेल कार्रवाई से मेल खाने वाले नाम के साथ टेम्पलेट को प्रस्तुत करने का एक अंतर्निहित प्रयास है। इसके अलावा कुछ भी कार्रवाई के लिए अधिक निर्देशों की आवश्यकता होती है, या एक कस्टम response_to ब्लॉक के साथ कई प्रारूप प्रतिक्रियाओं को संभालने के लिए कॉल करता है।

जैसा कि अधिकांश नियंत्रक अनुकूलन के काफी सामान्य पैटर्न का उपयोग करते हैं, उत्तरदाता अधिक डिफ़ॉल्ट व्यवहार शुरू करके अतिरिक्त स्तर प्रदान करते हैं। विशिष्ट स्वरूपों के लिए tox_xml / tojj कॉल करने वाली क्रियाएं पढ़ें, और उत्परिवर्ती क्रियाएं समान रूप से और साथ ही सफल म्यूटेटर क्रियाओं के लिए पुनर्निर्देशित करती हैं।


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

कक्षा स्तर: respond_to

यहां आप उन स्वरूपों को निर्दिष्ट करते हैं जो उत्तरदाता को संभालना चाहिए। स्वरूपों को अनुकूलित किया जा सकता है कि वे किन क्रियाओं पर लागू होंगे। प्रत्येक प्रारूप को अलग-अलग कॉल के साथ निर्दिष्ट किया जा सकता है, जिससे प्रत्येक प्रारूप के लिए क्रियाओं का पूर्ण अनुकूलन हो सकता है।

# Responds to html and json on all actions
respond_to :html, :json

# Responds to html and json on index and show actions only.
respond_to :html, :json, :only => [:index,:show]

# Responds to html for everything except show, and json only for index, create and update
respond_to :html, :except => [:show]
respond_to :json, :only => [:index, :create, :update]

कक्षा स्तर: responder

यह एक वर्ग विशेषता है जो उत्तरदाता को धारण करती है। यह कुछ भी हो सकता है जो कॉल करने के लिए प्रतिक्रिया करता है, जिसका अर्थ है कि आप एक खरीद / लंबो या एक वर्ग का उपयोग कर सकते हैं जो कॉल करने के लिए प्रतिक्रिया करता है। एक अन्य विकल्प मौजूदा प्रतिक्रियाकर्ता को मौजूदा तरीकों को अधिभार करने के लिए एक या मॉड्यूल मिश्रण करना है, जो डिफ़ॉल्ट व्यवहार को बढ़ाता है।

class SomeController < ApplicationController
  respond_to :json

  self.responder = proc do |controller, resources, options|
    resource = resources.last
    request = controller.request
    if request.get?
      controller.render json: resource
    elsif request.post? or request.put?
      if resource.errors.any?
        render json: {:status => 'failed', :errors => resource.errors}
      else
        render json: {:status => 'created', :object => resource}
      end
    end
  end
end

हालांकि कुछ दिलचस्प बढ़त उपयोग के मामले हो सकते हैं, यह अधिक संभावना है कि डिफ़ॉल्ट उत्तरदाता में मॉड्यूल का विस्तार या मिश्रण अधिक सामान्य पैटर्न होगा। किसी भी मामले में, जो विकल्प प्रासंगिक हैं, वे संसाधन और विकल्प हैं, क्योंकि उन्हें उत्तर_है।

उदाहरण स्तर: respond_with

यहां विकल्प वे हैं जो आपके नियंत्रक में रेंडर या पुनर्निर्देशित करने के लिए पारित किए जाएंगे, लेकिन वे केवल सफलता परिदृश्यों के लिए शामिल किए गए हैं। GET क्रियाओं के लिए ये रेंडर कॉल होंगे, अन्य कार्यों के लिए यह पुनर्निर्देशन के विकल्प होंगे। संभवतः इनमें से सबसे उपयोगी :locationविकल्प है, जिसका उपयोग उस रीडायरेक्ट पथ को ओवरराइड करने के लिए किया जा सकता है जब सही URL बनाने के लिए response_with के तर्क पर्याप्त नहीं होते हैं।

# These two are essentially equal
respond_with(:admin, @user, @post)
respond_with(@post, :location => admin_user_post(@user, @post)

# Respond with a 201 instead of a 200 HTTP status code, and also
# redirect to the collection path instead of the resource path
respond_with(@post, :status => :created, :location => posts_path)

# Note that if you want to pass a URL with a query string
# then the location option would be needed.
# /users?scope=active
respond_with(@user, :location => users_path(:scope => 'active'))

एक विकल्प के रूप में, उत्तरदाता मणि न केवल कुछ डिफ़ॉल्ट व्यवहार को ओवरराइड करने के लिए कुछ मॉड्यूल प्रदान करता है। यह एक अनाम वर्ग के साथ डिफ़ॉल्ट उत्तरदाता को ओवरराइड करता है जो डिफ़ॉल्ट उत्तरदाता को विस्तारित करता है, और इस वर्ग के लिए कस्टम मॉड्यूल में मिश्रण के लिए एक वर्ग स्तर की विधि प्रदान करता है। यहां सबसे उपयोगी फ्लैश रिस्पोंडर है, जो डिफ़ॉल्ट रूप से, I18n सिस्टम के लिए अनुकूलन का प्रतिनिधित्व करते हुए, फ्लैश का एक डिफ़ॉल्ट सेट प्रदान करता है config/locales/en.yml

पिछली परियोजनाओं में मैंने जिन कस्टम उत्तरदाताओं का उपयोग किया है, उनमें एक उत्तरदाता शामिल है जिसने स्वचालित रूप से मेरे संसाधनों को सजाया है, और पृष्ठ शीर्षक को आसानी से कस्टमाइज़ या ओवरराइड करने के लिए इंटरफ़ेस के साथ पृष्ठ शीर्षक का डिफ़ॉल्ट सेट प्रदान किया है।


1
मुझे लगता है कि आप (वर्ग निकाय में) का मतलब है कि self.responder =जैसे ही responder =एक स्थानीय
अश्वारोही ३०'१४

धन्यवाद! locationविकल्प के अस्तित्व की जानकारी थी जिसकी मुझे आवश्यकता थी!
जेल्लेकैट

1
क्या वह स्पष्टीकरण अभी भी 4/5 रेल के लिए प्रासंगिक है? मैंने सुना है कि respond_withपदावनत हो जाएगा, लेकिन मैं यह पता लगाने का प्रबंधन क्यों नहीं करता।
अर्नलेन सेप

1
@Arnlen, response_with को एक अलग मणि ' प्रतिसादकों ' के रूप में निकाला गया था
Nick Roz

ध्यान दें कि आपके config/locales/en.ymlकाम में चमक के लिए , आपको responders :flashअपने नियंत्रक के शीर्ष पर की आवश्यकता है ।
बजनॉर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.