रेल के लिए अद्यतन 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
।
पिछली परियोजनाओं में मैंने जिन कस्टम उत्तरदाताओं का उपयोग किया है, उनमें एक उत्तरदाता शामिल है जिसने स्वचालित रूप से मेरे संसाधनों को सजाया है, और पृष्ठ शीर्षक को आसानी से कस्टमाइज़ या ओवरराइड करने के लिए इंटरफ़ेस के साथ पृष्ठ शीर्षक का डिफ़ॉल्ट सेट प्रदान किया है।
self.responder =
जैसे हीresponder =
एक स्थानीय