2011-09-21 7 views
34

नीचे दिए गए कोड के लिए, क्या होता है यदि rendering_to को रेंडर या vise कविता के साथ बदलना है?रीडायरेक्ट_to और विनिमय योग्य प्रस्तुत कर रहे हैं?

def create 
    @product = Product.new(params[:product]) 

    respond_to do |format| 
    if @product.save 
     format.html { redirect_to(@product, :notice => 'Product was successfully created.') } 

    else 
     format.html { render :action => "new" } 
    end 
    end 
end 

ऐसा लगता है कि उपर्युक्त कोड में दूसरे के साथ एक स्थान बदल रहा है। क्या कोई ऐसी जगह है जहां केवल redirect_to या रेंडर का उपयोग किया जाना चाहिए? प्रस्तुतकर्ता एक दृश्य प्रस्तुत करने के अलावा कुछ भी नहीं करता है। Redirect_to सर्वर पर 302 अनुरोध भेजता है और रीडायरेक्ट करने के बाद वर्तमान पैरामीटर खो जाते हैं।

धन्यवाद।

उत्तर

98

कारण होगा , यह पिछले POST अनुरोध को दोबारा सबमिट करेगा। यह अवांछित परिणाम जैसे डुप्लिकेट खरीद और अन्य कारण हो सकता है।

enter image description here

लेकिन अगर आप redirect_to उपयोग कर रहे हैं, जब उपयोगकर्ता पेज ताज़ा करता है, यह सिर्फ इतना है कि एक ही पृष्ठ फिर से अनुरोध करेंगे। इसे Post/Redirect/Get (PRG) पैटर्न के रूप में भी जाना जाता है।

enter image description here

तो जगह है जहाँ redirect_to इस्तेमाल किया जाना चाहिए होता है जब आप एक HTTP पोस्ट अनुरोध कर रहे हैं और आप अनुरोध फिर से जमा करने के लिए उपयोगकर्ता नहीं करना चाहते इसके पूर्ण हो जाने (डुप्लिकेट आइटम और अन्य कारण हो सकता है जो समस्या का)।

रेल में, जब कोई मॉडल सहेजने में विफल रहता है, render का उपयोग पहले से भरने वाली प्रविष्टियों के साथ फ़ॉर्म को फिर से चलाने के लिए किया जाता है। यह आसान है क्योंकि यदि आप रीडायरेक्ट का उपयोग करते हैं, तो आपको पैरामीटर या सत्र का उपयोग करके फ़ॉर्म प्रविष्टियां पास करनी होंगी। साइड इफेक्ट यह है कि यदि आप ब्राउज़र को रीफ्रेश करते हैं, तो यह पिछले फॉर्म प्रविष्टियों को पुनः सबमिट करने का प्रयास करेगा। यह स्वीकार्य है क्योंकि यह संभवतः उसी तरह विफल हो जाएगा, या यदि यह अभी सफल है, तो उपयोगकर्ता को वैसे भी पहले स्थान पर उम्मीद करनी चाहिए।

render और redirect के बारे में गहराई से स्पष्टीकरण के लिए, आपको यह article पढ़ना चाहिए।

+0

धन्यवाद। यह एक संपूर्ण व्याख्या है। – user938363

+0

मुझे नहीं लगता कि मैंने एक और सही स्पष्टीकरण देखा है, अंत में व्यावहारिक उपयोग-मामले मतभेदों के साथ यह महत्वपूर्ण क्यों है। – ahnbizcad

+2

नोट: रीफ्रेशिंग * नहीं * यूआरएल बार में प्रवेश डालने जैसा ही है।यूआरएल बार में एंटर दबाकर बस उस यूआरएल को एक जीईटी अनुरोध भेजता है। रीफ्रेशिंग अंतिम अनुरोध को पुनः सबमिट करता है (जिसे ब्राउज़र ट्रैक करता है)। –

9

जब आप रीडायरेक्ट करते हैं तो आप एक नया अनुरोध उत्पन्न करेंगे जो नियंत्रक विधि को हिट करेगा, प्रस्तुत करने से संबंधित दृश्य प्रस्तुत करता है। आप निर्माण में रेंडर का उपयोग करते हैं क्योंकि यदि आप विफल रहता है तो आप मॉडल ऑब्जेक्ट की स्थिति रखना चाहते हैं ताकि आप इसकी त्रुटियों के बारे में जानकारी प्रस्तुत कर सकें। आप new_product पथ पर रीडायरेक्ट करने की कोशिश की, तो आप एक नया मॉडल वस्तु और ढीली सभी प्रपत्र डेटा उपयोगकर्ता में प्रवेश किया और किसी भी त्रुटि आदि आदि

संपादित करें (कुछ अधिक जानकारी के साथ) बनाने होगा:

एक का एक उदाहरण स्थिति जहां आपको redirect_to का उपयोग करना होगा, यदि आपका व्यू टेम्पलेट इंस्टेंस वैरिएबल का उपयोग करता है जो कि नियंत्रक विधि में प्रारंभ नहीं होता है जिसे आप रीडायरेक्ट कर रहे हैं। तो आप शायद अपने बनाने के विधि में render {:action => 'index'} कॉल नहीं कर सका क्योंकि सूचकांक टेम्पलेट शायद एक @products चर का उपयोग करता है, लेकिन अपने ही @product प्रारंभ तो यह आप render, जब उपयोगकर्ता पेज रिफ़्रेश का उपयोग कर रहे हैं तो एक अपवाद

+0

ऐसा लगता है कि अधिक स्थानों में उपयोग करने के लिए रेंडर सुरक्षित है। क्या कहीं भी है कि redirect_to का उपयोग किया जाना है? धन्यवाद। – user938363

+0

उदाहरण के लिए उपरोक्त संपादन देखें – Matthew

+0

उत्तर के लिए धन्यवाद। – user938363

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