नए बनाम बनाए जाते हैं


195

Restful कंट्रोलर में एक नई विधि को परिभाषित करने की आवश्यकता क्यों है, इसे बनाने की विधि के साथ पालन करें?

Google खोज ने मुझे वह उत्तर प्रदान नहीं किया जिसकी मुझे तलाश थी। मैं अंतर को समझता हूं, लेकिन यह जानने की जरूरत है कि वे जिस तरह से उपयोग किए जाते हैं, वे क्यों हैं।

जवाबों:


263

REST के कार्यान्वयन के भीतर नई और बनाएँ अलग तरह से व्यवहार किया जाता है।

एक HTTP GET /resources/newका उद्देश्य नए संसाधन बनाने के लिए उपयुक्त फॉर्म को प्रस्तुत करना है, जो यह नियंत्रक के भीतर नई कार्रवाई को कॉल करके करता है , जो एक नया सहेजा गया रिकॉर्ड बनाता है और प्रपत्र को प्रस्तुत करता है।

एक HTTP POST नए एक्शन के /resourcesहिस्से के रूप में बनाए गए रिकॉर्ड को लेने के लिए और इसे कंट्रोलर के भीतर क्रिएट एक्शन में पास करता है, जो तब इसे डेटाबेस में सहेजने का प्रयास करता है।


1
मैं एक रेल ट्यूटोरियल साइट में बिल्कुल इस जानकारी को स्किम्ड करता हूं। तब तक नहीं था जब तक मैं वास्तव में इसका उपयोग नहीं करता कि यह प्रासंगिक हो जाए।
स्टोरीमास्टरक्यू

248

से ActiveRecord :: बेस प्रलेखन:

create (विशेषताएँ = शून्य) {| ऑब्जेक्ट | ...}

एक ऑब्जेक्ट (या कई ऑब्जेक्ट्स) बनाता है और डेटाबेस में सहेजता है, यदि सत्यापन पास होते हैं। परिणामी वस्तु को लौटाया जाता है कि क्या वस्तु को डेटाबेस में सफलतापूर्वक सहेजा गया था या नहीं।

new (विशेषताएँ = शून्य) {| स्व यदि block_given? | ...}

नई वस्तुओं को या तो खाली (कोई निर्माण पैरामीटर पास नहीं) या विशेषताओं के साथ पूर्व-निर्धारित किया जा सकता है लेकिन अभी तक सहेजा नहीं गया है (संबंधित तालिका स्तंभ नामों से मेल खाते कुंजी नामों के साथ एक हैश पास करें)। दोनों उदाहरणों में, मान्य विशेषता कुंजियाँ संबंधित तालिका के स्तंभ नामों द्वारा निर्धारित की जाती हैं - इसलिए आपके पास ऐसी विशेषताएँ नहीं हो सकती हैं जो तालिका स्तंभों का हिस्सा नहीं हैं।

तो createनई वस्तु को तत्काल बदल देता है, इसे सत्यापित करता है, और फिर इसे डेटाबेस में सहेजता है। और newकेवल स्थानीय वस्तु बनाता है लेकिन इसे डीबी को मान्य या सहेजने का प्रयास नहीं करता है।


5
यह प्रश्न नियंत्रक विधियों के बारे में है, न कि मॉडल विधियों के बारे में।
सवेन्सएकट

8
@ कर्पी - डाउनवोट के लिए धन्यवाद। आप एक अच्छा बिंदु बनाते हैं, लेकिन विचार करें कि बहुत से लोगों ने इस उत्तर को उपयोगी पाया, खासकर जब से न तो शीर्षक या टैग इसे केवल नियंत्रक प्रश्न के रूप में कहते हैं। इसलिए मुझे लगता है कि यह उत्तर केवल मूल्य प्रदान करता है।
जस्टिन एथियर

16

नई एक नई मॉडल का उदाहरण देती है, लेकिन इसे सहेजने की विधि नहीं है।

क्रिएट नए जैसा ही करता है, लेकिन इसे डेटाबेस में सेव भी करता है।

कभी-कभी आप डेटाबेस में कुछ सहेजने से पहले सामान करना चाहते हैं, कभी-कभी आप इसे सीधे बनाना और सहेजना चाहते हैं।


1
यह प्रश्न नियंत्रक विधियों के बारे में है, न कि मॉडल विधियों के बारे में।
सवेन्सएकट

11

HTTP प्रोटोकॉल कैसे काम करता है, इसके लिए रेल्स के Restful भागों को बहुत करीब से बनाया गया है। HTTP प्रोटोकॉल में, GET अनुरोध किसी भी डेटा को संशोधित करने के लिए नहीं है। तार्किक रूप से, यदि आप Rails के सभी क्रियात्मक कार्यों के तरीके को देखते हैं, तो वे HTTP क्रियाओं के साथ मेल खाएंगे। एक POST नया डेटा जेनरेट करने के लिए है, इसलिए यह तार्किक रूप से निर्मित है। आप GET का उपयोग उस या अन्य शब्दों में, नई क्रिया के रूप के रूप में सेवा करने के लिए करते हैं। इंडेक्स और शो भी GETs हैं, अपडेट एक PUT (या Rails 4+ में PATCH) है, और नष्ट HTTP में एक DELETE है।

इसके अलावा, यह नियंत्रक में तर्क को अलग करता है और आपको त्रुटियों से निपटने का एक आसान तरीका देता है (त्रुटि संदेशों के साथ नई कार्रवाई को फिर से प्रस्तुत करना)।


"You use a GET to serve the form version of that or in other words, the new action"जवाब के लिए धन्यवाद, लेकिन व्यक्तिगत रूप से मुझे यह नामकरण सम्मेलन वास्तव में भ्रामक लगता है
डैनियल लिज़िक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.