2008-12-31 10 views
153

तो मैं लोगों को देख रहा हूं .build, .create, और .create! अपने नियंत्रकों के भीतर हाल ही में अधिक से अधिक। बस .new का उपयोग करने से क्या अंतर है और param'd ऑब्जेक्ट को निष्क्रिय करें और फिर। बचाओ? क्या पेशेवर और विपक्ष हैं? इन अन्य तरीकों का उपयोग लाभ प्रदान करते हैं?.build, .create, और .create के बीच अंतर! और उनका उपयोग कब किया जाना चाहिए?

उत्तर

216

एक जोड़े मतभेद रहे हैं, लेकिन वे बड़ा नहीं कर रहे हैं:

  1. .create.new.save के बाद के बराबर है। यह सिर्फ और संक्षिप्त है।
  2. .create!.new के समतुल्य है .save! (विफल होने पर त्रुटि में फेंकता है)। यह भी एक छोटा सा छोटा
  3. मुझे लगता है कि .build.new के लिए उपनाम है। यह works one way in Rails 3 और रेल < 3.x

सबसे महत्वपूर्ण हिस्सा में एक और तरीका यह है कि इन तरीकों एक संघ (has_many, आदि) स्वचालित रूप से दो मॉडल से जोड़ने के लिए के माध्यम से कहा जा सकता है है।

+1

मुझे यह उनके साथ जुड़े मॉडल को जोड़ने में सक्षम होने के उल्लेख के कारण सबसे सही उत्तर के रूप में चुना गया है - यह एक दिलचस्प और महत्वपूर्ण अंतर है जिसे मैं उपयोग करने के बारे में सोचता हूं। नया और .save। जो थोड़ा अतिरिक्त काम करता है। धन्यवाद। –

+11

3 - बिल्ड पर मामूली स्पष्टीकरण सिर्फ नए से थोड़ा अधिक है - यह एसोसिएशन लिंक भी सेट करता है। –

+0

आप कितने रिश्ते में एक एसोसिएशन के माध्यम से कॉल करते हैं? –

6

#create नया का छोटा संस्करण है और सहेजें। #create! वैधता सकारात्मक नहीं होने पर अपवाद फेंक रहा है।

5

मैं उपरोक्त उत्तरों को दूसरा दूंगा। प्लस create के लिए, कोई भी false को एक तर्क के रूप में पास नहीं कर सकता है जिसे आप save के साथ कर सकते हैं। एक तर्क के रूप false पासिंग सभी पटरियों को छोड़ देगा सत्यापन

31

हालांकि यह सही है कि create कॉल new और फिर save वहाँ उनकी वापसी मूल्यों में दो विकल्पों के बीच एक बड़ा अंतर है।

Save या तो true या false देता है इस पर निर्भर करता है कि वस्तु डेटाबेस में सफलतापूर्वक सहेजी गई थी या नहीं। इसके बाद ऊपर दिए गए प्रश्न में पहले उदाहरण के अनुसार प्रवाह नियंत्रण के लिए इसका उपयोग किया जा सकता है।

Create ऑब्जेक्ट सहेजा गया था या नहीं, इस पर ध्यान दिए बिना मॉडल वापस कर देगा। इस पर उपरोक्त कोड के लिए प्रभाव पड़ता है कि if कथन की शीर्ष शाखा हमेशा निष्पादित की जाएगी, भले ही ऑब्जेक्ट मान्यताओं में विफल रहता है और सहेजा नहीं जाता है।

यदि आप create का उपयोग ब्रांचिंग तर्क के साथ करते हैं तो आपको चुप विफलताओं का खतरा होता है, यदि आप new + save का उपयोग करते हैं तो यह मामला नहीं है।

create! एक ही समस्या से पीड़ित नहीं है क्योंकि यह रिकॉर्ड अमान्य है और अपवाद है।

create विकल्प नियंत्रकों में उपयोगी हो सकता है जहां respond_with API (JSON/XML) प्रतिक्रियाओं के लिए उपयोग किया जाता है। इस मामले में ऑब्जेक्ट पर त्रुटियों का अस्तित्व unprocessable_entity की स्थिति के साथ प्रतिक्रिया में त्रुटियों को वापस करने का कारण बनता है, जो कि आप एक एपीआई से वही चाहते हैं।

मैं हमेशा HTML के लिए new + save विकल्प का उपयोग करता हूं, खासकर यदि आप प्रवाह नियंत्रण के लिए वापसी मूल्य पर निर्भर हैं।

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