मेरे ऐप में, मैं कभी-कभी फ्लाई पर उपयोगकर्ता बनाता हूं, और उपयोगकर्ता का ईमेल मान्य प्रारूप होना चाहिए , और अद्वितीय हो।रेल 3.1: ऐप ActiveRecord :: RecordInvalid के लिए अलग-अलग कारणों को कैसे संभाल सकता है (उदाहरण के लिए, डुप्लिकेट बनाम सत्यापन त्रुटि)
मैं किस सत्यापन के कारण त्रुटि उत्पन्न करने के कारण विभिन्न स्थानों पर रीडायरेक्ट करना चाहता हूं: अवैध प्रारूप बनाम डुप्लिकेट।
मेरी कोड में मैं
begin
user.save!
flash[:notice] = "Created new user #{email} with password #{password}"
rescue ActiveRecord::RecordInvalid => e
flash[:alert] = "Failed to create account because #{e.message}"
redirect_to SOMEPLACE
end
है ईमेल (जैसे कि "उपयोगकर्ता उदाहरण @" के रूप में) अवैध स्वरूप e.message है "सत्यापन विफल: ईमेल अमान्य है" है
ईमेल हैं तालिका में पहले से मौजूद है, e.message "प्रमाणीकरण विफल रहा है: ईमेल पहले से ही लिया जा चुका है"
मुझे कारण निर्धारित करने के लिए e.message टेक्स्ट को पार्स करने के विचार से नफरत है ... क्या बचाव हैंडलर के लिए एक बेहतर तरीका है अंतर्निहित कारण का पता लगाने के लिए एक ActiveRecord :: RecordInvalid अपवाद डब्ल्यू फेंक दिया गया?
पीएस मुझे इस उदाहरण में पता है कि मैं बचत करने से पहले पहले से मौजूद ईमेल के लिए आगे की जांच कर सकता हूं, लेकिन मैं एक ही अपवाद फेंकने वाली अलग-अलग सत्यापन विफलताओं पर पहचान और अभिनय के सामान्य समाधान को समझने की कोशिश कर रहा हूं।
दरअसल वास्तव में पहले से मौजूद ईमेल के लिए आगे की जांच नहीं कर सकता है, ActiveRecord की विशिष्टता सत्यापन दौड़ की स्थिति के अधीन हैं और डिज़ाइन द्वारा विभाजित हैं। आपके डेटाबेस के अंदर एक विशिष्टता बाधा होनी चाहिए और आपको टी तैयार होना चाहिए o अपवाद के साथ सौदा करें कि यह उठाएगा (या तो 'सेव' या 'सेव!' से)। –