मैं रूबी और रेल के लिए नया हूं और मैं कोडिंग मानकों और सम्मेलनों को यथासंभव सर्वोत्तम रूप से पालन करना चाहता हूं, इसलिए मैं किसी भी बुरी आदतों को नहीं उठाता हूं। मेरे पास दो मॉडल हैं: पाठ्यक्रम और स्थान। एक कोर्स एक स्थान से संबंधित है, क्योंकि पाठ्यक्रम में केवल एक स्थान हो सकता है। एक स्थान में_मेनी पाठ्यक्रम हैं, क्योंकि एक स्थान को एक से अधिक पाठ्यक्रमों द्वारा साझा किया जा सकता है।रेलवे में मॉडल और एसोसिएशन कैसे सहेजे गए हैं, यह समझने के लिए संघर्ष कर रहे हैं
कोई कोर्स बनाते समय, एक स्थान पहले से मौजूद हो सकता है जो इसकी आईडी द्वारा पाया जाता है। या स्थान अभी तक मौजूद नहीं हो सकता है, इस मामले में एक नया स्थान रिकॉर्ड बनाया जाना चाहिए। माई कोर्स कंट्रोलर में निम्न कार्यवाही है।
def create
@course = Course.new(params[:course])
if params[:course][:location][:id].blank?
@course.location = Location.create(params[:course][:location])
else
@course.location = Location.find_by_id(params[:course][:location][:id])
end
@course.save
respond_with @course
end
ध्यान दें कि यह एक आरईएसटी एपीआई है जो केवल JSON के साथ प्रतिक्रिया देता है। जावास्क्रिप्ट अनुरोध पदों उसी प्रारूप में एक JSON सारणी कि GET अनुरोध द्वारा लौटा दिया जाएगा
{
"course":
{
"title":"US History",
"credits":"3",
"max_students":"100",
"location":
{
"id":"",
"building":"Freedom Hall",
"room":"301"
}
}
}
or
{
"course":
{
"title":"US History",
"credits":"3",
"max_students":"100",
"location":
{
"id":"12", # this is the only difference
"building":"Freedom Hall",
"room":"301"
}
}
}
- उदाहरण मैं पढ़ा है सब के साथ तुलना में, यह कोड इतना सुंदर नहीं लगती है कि बनाता है । क्या इसका कारक बेहतर तरीका है?
- यदि स्थान .create अपवाद उठाता है, तो @ course.save अभी भी कॉल किया जाएगा? क्या मुझे location.create का उपयोग करने की ज़रूरत है ??
- इसी प्रकार, सत्यापन पाठ्यक्रम त्रुटियों को @ कोर्स.एरर्स में समाप्त हो जाएगा, भले ही त्रुटियां स्थान मॉडल पर हों? क्या मुझे अपवाद से बचाव करने की आवश्यकता है ताकि मैं ग्राहक को त्रुटियों को वापस कर सकूं?
किसी भी और सभी मदद के लिए आपको बहुत बहुत धन्यवाद!
धन्यवाद! मैं इस तरह की ओर झुका रहा था लेकिन मेरे पास ठंडे पैर थे। और आपने अपवाद हैंडलिंग के बारे में अपने संदेह की पुष्टि की - मुझे पता नहीं था कि दृश्यों के पीछे कुछ भी हो रहा था जो मेरी अपेक्षाओं को प्रभावित कर सकता है। क्या मुझे अपने कोर्स मॉडल में 'accepts_nested_attributes_for: location' जोड़ने की आवश्यकता है? – glevine
आपका स्वागत है। कोई AFAIK आपको ऐसा करने के लिए 'accepts_nested_attributes_for: location' जोड़ने की आवश्यकता नहीं है क्योंकि आप स्पष्ट रूप से स्थान पर विशेषताओं को सेट कर रहे हैं। यद्यपि, यदि आपके पास नेस्टेड गुण थे, तो मेरा मानना है कि आप केवल '@course = courses.new (पैराम्स [: कोर्स])' के साथ सबकुछ आरंभ करने में सक्षम होंगे, और 'स्थान' विशेषताओं को स्वचालित रूप से सेट किया जाएगा। परीक्षण नहीं किया है कि हालांकि यह सुनिश्चित नहीं है कि यह स्थान 'आईडी' सेट होने पर काम करेगा या नहीं। –
मुझे कुछ परीक्षण लिखने की आवश्यकता होगी, लेकिन एक बार जब मैं करता हूं तो मैं अपने निष्कर्षों के साथ एक टिप्पणी जोड़ूंगा।मेरा डर यह है कि अगर 'आईडी' नेस्टेड स्थान पर सेट किया गया है, लेकिन अन्य सभी फ़ील्ड खाली हैं, तो रेल वास्तव में मिलान किए गए स्थान पर विशेषताओं को अपडेट करेंगे, उन्हें खाली करने के लिए सेट करेंगे (मान लें कि खाली फ़ील्ड वैध हैं), और सहेजें रिकॉर्ड। इसके परिणामस्वरूप स्थान रिकॉर्ड में डेटा मिटा दिया जाएगा। लेकिन मैं मदद नहीं कर सकता लेकिन सोचता हूं कि रेलों को यह जानने के लिए काफी समझदार है कि क्या करना है। जैसे मैंने कहा, एक बार मुझे पता है कि यह वास्तव में कैसे काम करता है, मैं फिर से जवाब दूंगा। – glevine