रेल में, मैं कैसे पता लगा सकता हूं कि असफलता के कारण (-सेवे) विफल होने के अलावा क्या है?


91

मैं जो लौटा रहा है एक ActiveRecord मॉडल trueसे valid?(और .errors खाली है), लेकिन लौटने falseसे save()। यदि मॉडल का उदाहरण मान्य है, तो मैं यह कैसे पता लगा सकता हूं कि बचत को विफल करने का कारण क्या है?


7
मुझे कुछ हफ़्ते पहले यह समस्या थी। कुछ रीफैक्टरिंग ने पहले ही एक_सेवे फंक्शन छोड़ दिया था, जो हर समय गलत होता रहा, जिसके कारण बचत विफल हो जाती है।
जेफ पैक्वे

1
@ जेफ - धन्यवाद, यह पता चला है कि एक: पहले_साथ विधि झूठी लौट रही थी। तुम्हे कैसे पता चला? क्या यह सिर्फ कोड निरीक्षण था?
kdt

यह कोड निरीक्षण था, और संस्करण नियंत्रण के विरुद्ध भिन्नता थी।
जेफ पाकेट

जवाबों:


48

अपने सभी कॉलबैक की जाँच करें।

मुझे इस तरह की समस्या थी जहां मेरे पास था और "after_validate" विधि जो मॉडल में परिवर्तनों का एक गुच्छा बनाने के बाद विफल हो रही थी। मॉडल वैध था, लेकिन "after_validate" गलत वापस आ रहा था, इसलिए यदि मैंने इसका इस्तेमाल किया तो model.validयह सच है, लेकिन फिर अगर मैंने इसे सहेजा तो मुझे सत्यापन की त्रुटियां हुईं (after_validate callback से गुजरना)। वह अजीब था।

एप्लिकेशन ट्रेस देखें और आपको यह देखने में सक्षम होना चाहिए कि कोड की कौन सी रेखा अपवाद को बढ़ा रही है।


2
जेफ की टिप्पणी के अनुसार, समस्या पहले की तरह हो गई थी।
kdt

3
@kdt - ठीक यही मेरी समस्या थी। मैंने इसके बारे में सोचा नहीं था क्योंकि पहले_सैव सिर्फ एक संपत्ति सेट करने के लिए था, लेकिन क्योंकि यह इसे झूठे मूल्य पर सेट कर रहा था, जो कि स्पष्ट रूप से वापस आ गया था और जिससे बचत चुपचाप विफल हो गई थी। चमकदार पक्ष पर, मेरे पास अब लाइन जोड़कर इस कोड को ठीक करने का विकल्प है "Hey! That's MY fake leg!" # Believe it or not, this is important। ऐसा नहीं है कि मैं ऐसा करूंगा। ;)
नाथन लॉन्ग

2
सच्चा रिटर्न वैल्यू सुनिश्चित करने का एक अच्छा तरीका हैtrue.tap { do_something }
नाथन लॉन्ग

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


116

बैंग संस्करण save!(अंत में एक विस्मयादिबोधक चिह्न के साथ) का उपयोग करने की कोशिश करें और परिणामी त्रुटि का निरीक्षण करें।


4
सहेजें! सिर्फ एक RecordNotSaved फेंक रहा है (जब मैं अपवाद को छोड़ता हूं। मुझे केवल अपवाद वर्ग का नाम मिलता है)। क्या मुझे कहीं और अधिक विस्तार की तलाश में होना चाहिए?
kdt

1
यदि आप रेल विकास मोड में हैं, तो स्टैक ट्रेस के साथ त्रुटि का पूर्ण विवरण प्रिंट करना चाहिए। किसी भी सुराग के लिए वहाँ एक नज़र डालें और / या यहाँ पोस्ट करें।
एंडी लिंडमैन

1
मैं कंसोल का उपयोग करता हूं, ऑब्जेक्ट को लोड करता हूं (उदाहरण के लिए, ओ = ऑब्जेक्ट.फीड #id), फिर ओ.वेसेव करें! जैसे उत्तर कहता है। यह प्रिंट करता है कि यह बचत क्यों नहीं कर रहा है।
pduey

1
FYI करें, कॉलिंग save!बढ़ा सकती है ActiveRecord::RecordInvalid(क्योंकि यह सत्यापन चलाता है) या ActiveRecord::RecordNotSavedइसलिए कि आप क्या बचाव करना चाहते हैं।
डेनिस

2
+1 क्योंकि यह मूलभूत प्रश्न का कम से कम असंतोषजनक उत्तर है .saveकि विफलताओं का निदान कैसे करें जो सत्यापन के कारण नहीं हैं। "कम से कम असंतोषजनक" योग्यता रेल को संदर्भित करती है, इस उत्तर को नहीं।
चक बेटसन

111

यदि @user.save(उदाहरण के लिए) रिटर्न मिलता है false, तो सभी त्रुटियों को प्राप्त करने के लिए बस इसे चलाएं:

@user.errors.full_messages

13
जैसा कि मैंने प्रश्न में उल्लेख किया है? सच है - यानी कोई सत्यापन त्रुटियाँ नहीं हैं। मैंने जाँच की है कि .err एक खाली सूची के रूप में अच्छी तरह से वापस आ रहा है (मैंने सवाल को इंगित करने के लिए अद्यतन किया है)
kdt

3

हाँ, मैंने यह सुनिश्चित करके इस मुद्दे को ठीक किया कि मैं अपने सभी पहले_ * कॉलबैक में सही लौटाता हूं फिर यह काम करना शुरू कर देता है :)


-1

मेरे पास समस्या यह थी कि मैं मॉडल के सत्यापन को जोड़ना भूल गया था।

class ContactGroup < ActiveRecord::Base
  validates_presence_of :name
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.