2012-01-25 8 views
15

में कोई त्रुटि नहीं है, सहेजने के दौरान मॉडल सहेजते समय मुझे सत्यापन त्रुटियों में कोई समस्या है! ActiveRecord त्रुटि मॉडल त्रुटि संदेश खाली हैं, इसलिए मुझे नहीं पता कि सत्यापन प्रयास पर त्रुटियां क्या हो रही हैं। जब मैं documentation के अनुसार त्रुटियों .full_messages या error.each_full आज़माता हूं, तो यह त्रुटियों को प्रदर्शित करना चाहिए, जो यह नहीं करता है।सत्यापन प्राप्त करने वाले रेल में त्रुटि विफल रही, लेकिन ActiveRecord त्रुटि मॉडल

मॉडल जिसे मैं सहेजने की कोशिश कर रहा हूं वह ऑर्डर मॉडल (स्प्री का उपयोग कर ईकॉमर्स साइट) है। जब ऑर्डर में कोई आइटम हटा दिया जाता है, तो update_totals! कहा जाता है जो कुल योग का पुनर्मूल्यांकन करता है, और फिर बचाओ! कहा जाता है, जो सत्यापन त्रुटि को ट्रिगर करता है (यह त्रुटि बहुत ही कम होती है लेकिन केवल तभी जब मैं में लॉग इन हूं, और मैं इसका कारण ढूंढने में सक्षम हूं)।

validates_numericality_of :item_total 
    validates_numericality_of :total 

मैं order.item_total.inspect, order.total.inspect, और order.errors.full_messages.inspect दर्ज की गई और यह मिल गया:

Wed Jan 25 08:53:08 -0800 2012order item total: #<BigDecimal:15780c60,'0.279E2',8(16)> 
Wed Jan 25 08:53:08 -0800 2012order total: #<BigDecimal:152bf410,'0.2448225E2',12(20)> 
Wed Jan 25 08:53:08 -0800 2012: ERRORS SAVING ORDER: 
Wed Jan 25 08:53:08 -0800 2012[] 

आदेश मॉडल अपने मॉडल में दो सत्यापन है item_total और कुल mySQL डेटाबेस में दशमलव (8,2) के रूप में संग्रहीत हैं। अंतिम पंक्ति order.errors.full_messages.inspect है, जो एक खाली सरणी है। सत्यापन त्रुटि इस तरह दिखता है: मेरे सवाल

ActiveRecord::RecordInvalid (Validation failed: {{errors}}): 
    vendor/extensions/mgx_core/app/models/order.rb:382:in `update_totals!' 
    vendor/extensions/mgx_core/app/controllers/line_items_controller.rb:7:in `destroy' 
    app/middleware/flash_session_cookie_middleware.rb:19:in `call' 
    C:\Users\mgx\My Documents\Aptana Studio 3 Workspace\catalogue-spree\script\server:3 
    c:/Ruby187/lib/ruby/gems/1.8/gems/ruby-debug-ide-0.4.16/lib/ruby-debug-ide.rb:112:in `debug_load' 
    c:/Ruby187/lib/ruby/gems/1.8/gems/ruby-debug-ide-0.4.16/lib/ruby-debug-ide.rb:112:in `debug_program' 
    c:/Ruby187/lib/ruby/gems/1.8/gems/ruby-debug-ide-0.4.16/bin/rdebug-ide:87 
    c:/Ruby187/bin/rdebug-ide:19:in `load' 
    c:/Ruby187/bin/rdebug-ide:19 

मुझे लगता है कि दोहरा है:

1. क्यों मेरी ActiveRecord त्रुटियों मॉडल नहीं कह रहा है क्या सत्यापन त्रुटि है?

2. मैं इस समस्या को कैसे ठीक करूं? क्या मेरा item_total और दशमलव दशमलव (8,2) के रूप में सहेजने के लिए मान्य है?

मैं रेल 2.3.5 और होड़ 0.10.2

+0

आप डीबी से आदेश और line_item कैसे प्राप्त कर रहे हैं (यानी आपके नियंत्रक कार्रवाई में क्या है)? –

+0

जब कोई उपयोगकर्ता शॉपिंग कार्ट में निकालें बटन हिट करता है, तो यह line_items नियंत्रक में नष्ट नामक फ़ंक्शन को कॉल करता है। नष्ट करने के लिए कोड है: 'LINE_ITEM = LineItem.find (पैरामीटर [: id],: शामिल हैं =>: आदेश) क्रम = line_item.destroy line_item.order order.update_totals' update_totals! कुछ गणित को नए योग की गणना करने के लिए करता है और फिर self.save कहते हैं! जो सत्यापन त्रुटि – Zyren

+0

को ट्रिगर करता है बस यहां मामले में, लेकिन क्या लाइनइटम नष्ट होने पर ऑर्डर को नष्ट कर देता है? दूसरे शब्दों में, क्या आप सुनिश्चित हैं कि कुल योग अपडेट करने से पहले ही आदेश स्वयं ही मान्य है? बचाना! सत्यापन विफलता पर अपवाद फेंकना चाहिए, इसलिए मुझे लगता है कि आपको अपने लॉग या जो भी त्रुटि में त्रुटि दिखाई देगी। –

उत्तर

25

आप before_validation घोषणाओं है और अगर वे false लौट तो आप एक खाली त्रुटि संदेश के साथ एक Validation failed (ActiveRecord::RecordInvalid) संदेश मिलेगा (अगर कोई अन्य त्रुटियों कर रहे हैं) है।

ध्यान दें कि before_validation कॉलबैक false नहीं लौटाना चाहिए (nil ठीक है) और इस दुर्घटना, उदा तब हो सकता है आपको लगता है कि कॉलबैक विधि के अंदर अंतिम पंक्ति में एक बूलियन विशेषता को false बताए जाते हैं।स्पष्ट रूप से अपने कॉलबैक में तरीकों इस काम करने के लिए return true बारे में (या बस true अंत में अगर आपके कॉलबैक एक ब्लॉक (के रूप में) टिप्पणी में जेसी Wolgamott द्वारा नोट है)।

अद्यतन: यह अब और नहीं, एक मुद्दा 5.0 शुरू कर रेल हो जाएगा के रूप में return false अब कॉलबैक श्रृंखला को रोकने (throw :abort अब कॉलबैक श्रृंखला को रोकती है) होगा।

अद्यतन: यदि कॉलबैक false देता है तो आपको ActiveRecord::RecordNotSaved: Failed to save the record भी मिल सकता है।

+1

यह बहुत अच्छा काम किया! एक अपडेट: आपको अपने पहले_विधीकरण ब्लॉक के अंत में "सत्य" लिखना होगा। "सत्य वापस" असफल हो जाएगा क्योंकि यह एक ब्लॉक में है। –

+0

धन्यवाद @ जेसेवेल्गामॉट, मैंने जवाब अपडेट किया है। –

+0

इसमें मुझे लगता है कि 'pre_save' भी शामिल है, क्योंकि यह तय करने से पहले मेरी शून्य की आखिरी पंक्ति के रूप में' शून्य 'लिखना है! –

0

उपयोग कर रहा हूँ मुझे लगता है कि समस्या नियंत्रक कोड में निहित है। ऑर्डर वेरिएबल लाइन आइटम नष्ट होने से पहले सेट किया गया है, और यह नहीं पता कि इसे बाद में नष्ट कर दिया गया है। यह कोड वास्तव में मॉडल में होना चाहिए:

# line_item.rb 
after_destroy :update_totals! 
delegate :update_totals, :to=> :order 

और नियंत्रक को लाइन आइटम को नष्ट करना चाहिए।

0

के संबंध में 1. मेरा सक्रिय रिकॉर्ड त्रुटियां मॉडल क्यों नहीं कह रहा है कि सत्यापन त्रुटि क्या है?, देखें कि आपके पास मणि i18n स्थापित है या नहीं। यदि आप करते हैं, तो अनइंस्टॉल करने या मणि i18n के पुराने संस्करण को आजमाएं।

gem uninstall i18n 
0

ऐसा लगता है कि आप रूबी 1.8.7 का उपयोग कर रहे हैं। क्या आपने रुबी 1.9.3 का उपयोग करके अपना ऐप चलाने की कोशिश की है?

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