2012-05-23 12 views
17

अपडेट करने से पहले पैरा के साथ मान्य है, मेरे पास बहुत ही नया सवाल है। मॉडल की उस ऑब्जेक्ट को कैसे अपडेट किया जा सकता है इसे अपडेट करने से पहले नए पैरा के साथ मान्य है?रेल 3 - जांचें कि ऑब्जेक्ट

def update 
    @obj = SomeModel.find(params[:id]) 

    if @obj.update_attributes(params[:obj]) 
    # That have been updated 
    else 
    # Ups, errors! 
    end 
end 

ऐसा ही कुछ करने के लिए::

def update 
    @obj = SomeModel.find(params[:id]) 

    if @obj.valid_with_new_params(params[:obj]) 
    @obj.update_attributes(params[:obj]) 
    else 
    # Ups, errors! 
    end 
end 

उत्तर

35

चाहते हैं नहीं कर रहा हूँ, आप

उपयोग कर सकते हैं
@obj.assign_attributes(params[:obj]) 

फिर अगर वस्तु मान्य है, आप

@obj.valid? 

कॉल कर सकते हैं, तो वस्तु मान्य नहीं है की जाँच करने के , आप

@obj.errors 

फोन करके त्रुटियों (केवल .valid? बुला के बाद) दिखाई देता है वस्तु मान्य है सकते हैं, आप

@obj.save 

बुला हालांकि द्वारा इसे सहेज सकते हैं, इस आमतौर पर के सभी आवश्यक नहीं है यदि ऑब्जेक्ट मान्य नहीं है, तो ActiveRecord ऑब्जेक्ट को डेटाबेस में सहेज नहीं पाएगा, इसलिए जब आप नियंत्रक कार्रवाई छोड़ते हैं तो सभी विशेषता परिवर्तन भूल जाते हैं।

इसके अलावा, चूंकि एक अवैध रिकॉर्ड डेटाबेस में सहेजा नहीं जाएगा, इसलिए आप मूल ऑब्जेक्ट को वापस पाने के लिए हमेशा ऑब्जेक्ट.फिंड() को कॉल कर सकते हैं।

+4

@ obj.attributes के बाद (पैराम्स [: obj]), @ obj.save पर कॉल करें। –

+0

इस लेखन के समय इस उत्तर में दिखाए गए 'गुण() 'विधि को बहिष्कृत किया गया है। इसके बजाय 'assign_attributes (new_attributes)' या उपनाम 'विशेषताएँ = (new_attributes)' का उपयोग करें। इस प्रकार इस उत्तर में पहली पंक्ति '@ obj.assign_attributes (पैराम्स [: obj]) होना चाहिए। [ActiveRecord :: विशेषता Assignment] देखें (http://api.rubyonrails.org/classes/ActiveRecord/AttributeAssignment.html) – user664833

+0

पुन: 'assign_attributes (new_attributes) '- ध्यान दें कि * केवल एक ही विशेषता सेट हैं जो कि कुंजी द्वारा नामित हैं पैरा हैश *। तो यदि आपके पास कोई मौजूदा ऑब्जेक्ट है, तो आप केवल गुणों का एक सबसेट जोड़/विलय कर सकते हैं। – user664833

0

वस्तु अगर पारित तर्क एक वैध वस्तु का उत्पादन नहीं करता सहेजा नहीं जाएगा, तो आप कर सकते हैं

मुझे लगता है कि बदलने चाहते हैं अपने रास्ते का उपयोग ठीक है। आप @obj.errors सरणी का उपयोग कर त्रुटियों (यदि कोई हैं) देख सकते हैं।

0

update_attributes विधि ऑब्जेक्ट को सत्यापित करें और ऑब्जेक्ट अमान्य होने पर झूठी वापसी करें। तो, आप बस लिख सकते हैं:

if @obj.update_attributes(params[:obj]) 
    # That have been update 
else 
    # Ups, errors! 
end 
3

आप सत्यापन को चलाने के लिए valid? विधि कॉल कर सकते हैं।

यह गारंटी नहीं देता है कि आपकी कुछ मान्यताओं डेटाबेस में अन्य वस्तुओं की स्थिति पर निर्भर करती हैं। ते बचाने के भी सत्यापन से असंबद्ध कारणों से विफल हो सकता है (उदाहरण के लिए एक विदेशी कुंजी बाधा)

मुझे यकीन है कि क्यों उन्हें बिना सहेजे विशेषताओं को अपडेट करने के इस पैटर्न

+1

मैं कुछ बचत कर रहा हूँ विभिन्न मॉडल की वस्तुओं। तो मैं प्रत्येक मॉडल के सत्यापन की त्रुटियों को इकट्ठा करता हूं और फिर इसे एक पॉपअप में दिखाता हूं। – ExiRe

0

जवाब यह है कि आप एक विधि

def valid_with_new_params(hash) 
    self.attributes = hash 
    valid? 
end 

परिभाषित कर सकते हैं लेकिन यह क्योंकि @obj.update_attributes(params[:obj]) रिटर्न true अगर obj सफलतापूर्वक अपडेट किया गया और false अन्यथा अनावश्यक होगा। ध्यान दें कि आंतरिक रूप से update_attributes विधि @obj पर सभी मान्यताओं को चलाती है ताकि अद्यतन विफल होने पर @obj.errors उपलब्ध हो।अगर वस्तु मान्य

@obj.valid? 

जांच करने के लिए है

+1

'विशेषता =' रेल – apneadiving

+0

के नए संस्करणों में विधि को बहिष्कृत किया गया है धन्यवाद @apneadiving को इसके बारे में पता नहीं था :) – Gerry

0

उन्हें

@obj.attributes = params[:obj] 0r 
@obj.attributes = {:name => “Rob”} 

सहेजे बिना गुण अद्यतन करने के लिए तो जाँच करने के लिए अगर कोई त्रुटि

@obj.errors 
संबंधित मुद्दे