2012-10-26 19 views
5

मैं रूबी और रेल के लिए नया हूं और मैं कोडिंग मानकों और सम्मेलनों को यथासंभव सर्वोत्तम रूप से पालन करना चाहता हूं, इसलिए मैं किसी भी बुरी आदतों को नहीं उठाता हूं। मेरे पास दो मॉडल हैं: पाठ्यक्रम और स्थान। एक कोर्स एक स्थान से संबंधित है, क्योंकि पाठ्यक्रम में केवल एक स्थान हो सकता है। एक स्थान में_मेनी पाठ्यक्रम हैं, क्योंकि एक स्थान को एक से अधिक पाठ्यक्रमों द्वारा साझा किया जा सकता है।रेलवे में मॉडल और एसोसिएशन कैसे सहेजे गए हैं, यह समझने के लिए संघर्ष कर रहे हैं

कोई कोर्स बनाते समय, एक स्थान पहले से मौजूद हो सकता है जो इसकी आईडी द्वारा पाया जाता है। या स्थान अभी तक मौजूद नहीं हो सकता है, इस मामले में एक नया स्थान रिकॉर्ड बनाया जाना चाहिए। माई कोर्स कंट्रोलर में निम्न कार्यवाही है।

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" 
    } 
    } 
} 
  1. उदाहरण मैं पढ़ा है सब के साथ तुलना में, यह कोड इतना सुंदर नहीं लगती है कि बनाता है । क्या इसका कारक बेहतर तरीका है?
  2. यदि स्थान .create अपवाद उठाता है, तो @ course.save अभी भी कॉल किया जाएगा? क्या मुझे location.create का उपयोग करने की ज़रूरत है ??
  3. इसी प्रकार, सत्यापन पाठ्यक्रम त्रुटियों को @ कोर्स.एरर्स में समाप्त हो जाएगा, भले ही त्रुटियां स्थान मॉडल पर हों? क्या मुझे अपवाद से बचाव करने की आवश्यकता है ताकि मैं ग्राहक को त्रुटियों को वापस कर सकूं?

किसी भी और सभी मदद के लिए आपको बहुत बहुत धन्यवाद!

उत्तर

2

इस प्रयास करें, अपने नियंत्रक

def new 
    @course = Course.new 
    @location = @course.location.build # if one..many relationship 
    @location = @course.build_location # if one..one relationship 
end 

def create 
@course = Course.new(params[:course]) 
if @course.save 
    respond_with @course 
else 
    render :action => "new" 
end 
end 

अधिक में आपको लगता है कि साफ कर सकते हैं find_or_initialize_by_id का उपयोग करके। यह काम करना चाहिए:

def create 
    @course = Course.new(params[:course]) 
    @course.location = Location.find_or_initialize_by_id(params[:course][:location][:id], 
                 params[:course][:location]) 
    @course.save 
    respond_with @course 
end 

अपने दूसरे प्रश्न के बारे में, अपने कोड में के रूप में आप यह @course.save अगर Location.create (या Location.find) एक अपवाद को जन्म देती है बुलाया नहीं किया जाएगा (क्योंकि वे पहले क्या होगा) है। हालांकि, जिस तरह से मैंने इसे ऊपर कोड किया है, अपवाद कोड में उसी बिंदु पर होगा, जब save कहा जाता है, जिस बिंदु पर एसोसिएशन भी सहेजा जाता है।

+0

धन्यवाद! मैं इस तरह की ओर झुका रहा था लेकिन मेरे पास ठंडे पैर थे। और आपने अपवाद हैंडलिंग के बारे में अपने संदेह की पुष्टि की - मुझे पता नहीं था कि दृश्यों के पीछे कुछ भी हो रहा था जो मेरी अपेक्षाओं को प्रभावित कर सकता है। क्या मुझे अपने कोर्स मॉडल में 'accepts_nested_attributes_for: location' जोड़ने की आवश्यकता है? – glevine

+0

आपका स्वागत है। कोई AFAIK आपको ऐसा करने के लिए 'accepts_nested_attributes_for: location' जोड़ने की आवश्यकता नहीं है क्योंकि आप स्पष्ट रूप से स्थान पर विशेषताओं को सेट कर रहे हैं। यद्यपि, यदि आपके पास नेस्टेड गुण थे, तो मेरा मानना ​​है कि आप केवल '@course = courses.new (पैराम्स [: कोर्स])' के साथ सबकुछ आरंभ करने में सक्षम होंगे, और 'स्थान' विशेषताओं को स्वचालित रूप से सेट किया जाएगा। परीक्षण नहीं किया है कि हालांकि यह सुनिश्चित नहीं है कि यह स्थान 'आईडी' सेट होने पर काम करेगा या नहीं। –

+0

मुझे कुछ परीक्षण लिखने की आवश्यकता होगी, लेकिन एक बार जब मैं करता हूं तो मैं अपने निष्कर्षों के साथ एक टिप्पणी जोड़ूंगा।मेरा डर यह है कि अगर 'आईडी' नेस्टेड स्थान पर सेट किया गया है, लेकिन अन्य सभी फ़ील्ड खाली हैं, तो रेल वास्तव में मिलान किए गए स्थान पर विशेषताओं को अपडेट करेंगे, उन्हें खाली करने के लिए सेट करेंगे (मान लें कि खाली फ़ील्ड वैध हैं), और सहेजें रिकॉर्ड। इसके परिणामस्वरूप स्थान रिकॉर्ड में डेटा मिटा दिया जाएगा। लेकिन मैं मदद नहीं कर सकता लेकिन सोचता हूं कि रेलों को यह जानने के लिए काफी समझदार है कि क्या करना है। जैसे मैंने कहा, एक बार मुझे पता है कि यह वास्तव में कैसे काम करता है, मैं फिर से जवाब दूंगा। – glevine

1

के बारे में nested_attributes

+0

उत्तर के लिए धन्यवाद! Find_or_initialize_by_id का उपयोग करने के विरोध में ऐसा करने का क्या फायदा है? मुझे नेस्टेड मॉडल के बारे में अधिक जानने की जरूरत है। मुझे लगता है कि मैंने घोंसले से संबंधित होने के साथ बिंदुओं को जोड़ा नहीं था। – glevine

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

  • कोई संबंधित समस्या नहीं^_^