2013-12-10 7 views
5

मुझे समझ में कैसे काम करता है respond_to जब यह कुछ इस तरह से कहा जाता है:ब्लॉक के बिना बुलाए जाने पर प्रतिक्रिया क्या करती है?

def index 
    @users = User.all 
    respond_to do |format| 
    format.html 
    format.json { render json: @users } 
    end 
end 

लेकिन मैं जैसे जो respond_to पारित प्रतीकों की एक सूची नियंत्रक तरीकों में से बाहर, कुछ ऐप्स, देखा है:

class UsersController < ApplicationController 

    respond_to :html, :json 

    def index 
    # blah blah bah 
    end 
end 

यह क्या करता है? मैं अपने नियंत्रकों में से एक में इसके साथ खेल रहा हूं और मैं यह नहीं समझ सकता कि इससे क्या फर्क पड़ता है।

उत्तर

2

किसी दिए गए नियंत्रक कार्रवाई के लिए, #respond_with क्लाइंट द्वारा अनुरोध किए गए माइम-प्रकार के आधार पर उचित प्रतिक्रिया उत्पन्न करता है।

विधि सिर्फ एक संसाधन के साथ कहा जाता है, तो इस उदाहरण में -

class PeopleController < ApplicationController 
    respond_to :html, :xml, :json 

    def index 
    @people = Person.all 
    respond_with @people 
    end 
end 

तो प्रतिक्रिया की माइम-प्रकार आम तौर पर अनुरोध के स्वीकार करें शीर्षक और घोषित उपलब्ध प्रारूपों के सेट के आधार पर चयन किया जाता है पिछले कॉल द्वारा नियंत्रक की क्लास विधि answer_to पर। वैकल्पिक रूप से माइम-प्रकार को नियंत्रक में request.format को स्पष्ट रूप से सेट करके चुना जा सकता है।

यदि स्वीकार्य प्रारूप की पहचान नहीं की जाती है, तो एप्लिकेशन '406 - स्वीकार्य नहीं' स्थिति देता है। अन्यथा, डिफ़ॉल्ट प्रतिक्रिया वर्तमान कार्रवाई और चयनित प्रारूप के नाम पर एक टेम्पलेट प्रस्तुत करना है, उदा। index.html.erb। यदि कोई टेम्पलेट उपलब्ध नहीं है, तो व्यवहार चयनित प्रारूप पर निर्भर करता है:

एचटीएमएल प्रतिक्रिया के लिए - यदि अनुरोध विधि प्राप्त होती है, तो अपवाद उठाया जाता है लेकिन प्रतिक्रिया के बाद अन्य अनुरोधों के लिए संसाधन पर कोई निर्भर करता है या नहीं सत्यापन त्रुटियां (यानी यह मानते हुए कि संसाधन को बचाने के लिए एक प्रयास किया गया है, उदाहरण के लिए एक निर्माण कार्रवाई द्वारा) -

यदि कोई त्रुटि नहीं है, यानी संसाधन सफलतापूर्वक सहेजा गया था, तो प्रतिक्रिया संसाधन को संसाधन यानी इसकी शो क्रिया ।

यदि सत्यापन त्रुटियां हैं, तो प्रतिक्रिया एक डिफ़ॉल्ट कार्रवाई प्रदान करती है, जो है: पोस्ट अनुरोध के लिए नया या: पैच या डाल के लिए संपादित करें।

इस प्रकार इस तरह एक उदाहरण -

def create 
    @user = User.new(params[:user]) 
    respond_to do |format| 
    if @user.save 
     flash[:notice] = 'User was successfully created.' 
     format.html { redirect_to(@user) } 
     format.xml { render xml: @user } 
    else 
     format.html { render action: "new" } 
     format.xml { render xml: @user } 
    end 
    end 
end 

एक जावास्क्रिप्ट अनुरोध के लिए - -

respond_to :html, :xml 

def create 
    @user = User.new(params[:user]) 
    flash[:notice] = 'User was successfully created.' if @user.save 
    respond_with(@user) 
end 

बराबर है, के लिए है, create.html.erb के अभाव में यदि टेम्पलेट नहीं है पाया, एक अपवाद उठाया गया है।

अन्य अनुरोधों के लिए - यानी डेटा प्रारूप जैसे कि एक्सएमएल, जेसन, सीएसवी इत्यादि, अगर संसाधन को उत्तर देने के साथ पास किया गया है, तो विधि का अनुरोध सीधे अनुरोधित प्रारूप में संसाधन प्रस्तुत करने का प्रयास करता है, उदाहरण के लिए। एक एक्सएमएल अनुरोध के लिए, प्रतिक्रिया xml: संसाधन को रेंडर करने के बराबर है।

+0

तो विधि के बाहर 'respond_to' अर्थहीन है यदि कोई भी तरीका' respond_with' 'कहता है? – GMA

+1

दूसरे शब्दों में आपको answer_with विधि के साथ एक जोड़ी में क्लास विधि answer_to का उपयोग करना चाहिए या कार्रवाई विधि में ब्लॉक के साथ example method answer_to का उपयोग करना चाहिए। – SergeyKutsko

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