2010-10-28 10 views
10

मैं अपने मॉडल के भीतर मॉडल तर्क रखने की कोशिश कर रहा हूं, लेकिन मैं इसे अपने आप में संशोधन करने के लिए नहीं मिल सकता और उन्हें डेटाबेस में बना रहता हूं।रेल: मैं अपने मॉडल में 'self.save` कैसे कॉल करूं और इसे डेटाबेस में जारी रखूं?

मेरी नियंत्रक में:

@article.perform_some_calulcations! 

अपने मॉडल में:

def perform_some_calculations! 
    self.foo.gsub!(/regexp/, 'string') 
    self.save 
end 

अगर मैं अपने विधि में और नियंत्रक में यह करने के लिए अपने कॉल के बाद debugger बयान ड्रॉप, @article.foo सही मूल्य है। हालांकि, जब मैं जारी रहता हूं, तो यह डेटाबेस में नहीं रहता है और Webrick किसी भी UPDATE कथन की रिपोर्ट नहीं करता है।

क्या गलत हो रहा है? मुझे नहीं पता कि मुझे पहले कभी ऐसा करना है, लेकिन निश्चित रूप से यह सही है?

उत्तर

16

आपका समस्या यह थी कि यदि आप एक विशेषता "स्थान पर" संशोधित करते हैं तो इसका मतलब है: यह एक नया मान बताए, तो रेल, सोचेंगे तो यह कोई नई बात नहीं बचाया जा है कि वहाँ " "बचाओ" अनुकूलित करता है।

आपकी विशेषता का प्रत्येक लेखन एक्सेसर ध्वज सेट करेगा, इसलिए सहेजने की विधि यह जान लेगी कि यह जांचना चाहिए कि वर्तमान मान डेटाबेस से पढ़ने वाले मान से वास्तव में अलग है या नहीं। यही कारण है कि self.foo = self.foo.gsub(/regexp/, 'string') काम करता है (ध्यान दें कि विस्मयादिबोधक चिह्न यहां आवश्यक नहीं है)

आप gsub! या replace, उपयोग के साथ उदाहरण के लिए एक विशेषता "स्थान पर" संशोधित करने के लिए, की जरूरत है:

def perform_some_calculations! 
    foo_will_change! 
    self.foo.gsub!(/regexp/, 'string') 
    self.save 
end 
+0

अतिरिक्त जानकारी के लिए धन्यवाद – nfm

+0

उत्तर के रूप में चिह्नित किया जाना चाहिए IMHO – Kangur

+0

क्या यह एक अच्छा अभ्यास है? यानी कुछ गणना करने के बाद मॉडल कॉलिंग स्वयं ही सहेजती है? – Nicolas

2

आपके गुण सुरक्षित हो सकते हैं। अपना लॉग जांचें अगर ऐसा है तो

self.save! 

या

self.save(false) 

विस्मयादिबोधक अपनी परिभाषा बंद इंगित लेने का प्रयास करें।


self.foo = self.foo.gsub!(/regexp/, 'string') 
+0

अच्छा विचार है, लेकिन 'self.save' और 'self.save (गलत)' दोनों का एक ही परिणाम है। Webrick लॉग में कहीं भी 'attr_protected' का कोई संकेत या कोई चेतावनी नहीं। – nfm

+0

अपनी परिभाषा से विस्मयादिबोधक बिंदु लेने का प्रयास करें। – s84

+0

विधि नाम से '!' को हटाने के साथ कोई पासा नहीं – nfm