2010-05-25 9 views
11

को सहेजने के लिए ऑब्जेक्ट कैसे प्राप्त करूं, मैं grails के लिए नया हूं और एक फॉर्म बनाने की कोशिश कर रहा हूं जो उपयोगकर्ता को उस साइट के लिए अपने खाते से जुड़े ईमेल पते को बदलने की अनुमति देता है।Grails, मैं

यह उपयोगकर्ता को उनके वर्तमान पासवर्ड के लिए और नए ईमेल पते के लिए भी पूछता है जो वे उपयोग करना चाहते हैं। यदि उपयोगकर्ता गलत पासवर्ड या एक अवैध ईमेल पता दर्ज करता है तो उसे एक उचित त्रुटि संदेश से खारिज कर देना चाहिए।

अब ईमेल सत्यापन को grails में बाधाओं के माध्यम से किया जा सकता है, लेकिन पासवर्ड परिवर्तन को उनके वर्तमान पासवर्ड से मेल खाना पड़ेगा। मैंने इस चेक को सेवा वर्ग पर एक विधि के रूप में लागू किया है। नीचे

कोड देखें:

def saveEmail = 
{ 
    def client = ClientUser.get(session.clientUserID) 
    client.email = params.email 
    if(clientUserService.checkPassword(session.clientUserID , params.password) ==false) 
    { 
     flash.message = "Incorrect Password" 
     client.discard() 
     redirect(action:'changeEmail') 
    }  
    else if(!client.validate()) 
    { 
     flash.message = "Invalid Email Address" 
     redirect(action:'changeEmail') 
    } 
    else 
    { 
     client.save(); 
     session.clientUserID = null; 
     flash.message = "Your email address has been changed, please login again" 
     redirect(controller: 'clientLogin' , action:'index') 
    } 
} 

अब मैं क्या देखा है कि अजीब था कि अगर मैं एक अमान्य ईमेल तो दर्ज की गई यह परिवर्तन (उम्मीद के रूप में) नहीं बचा होगा, लेकिन अगर मैं गलत पासवर्ड और एक में प्रवेश किया वैध ईमेल तो यह परिवर्तनों को सहेज लेगा और उन्हें डेटाबेस में वापस भी लिख देगा, भले ही यह सही "अमान्य पासवर्ड" त्रुटि संदेश देगा।

मैं सभी को/तो अगर अन्यथा/तो ब्लॉक में पाया गया तो यह तोड़ने वाले बिंदुओं को तोड़ दिया गया था और पाया कि यह पहली बार अगर कथन की उम्मीद है और दूसरों को मार नहीं रहा है, तो यह सहेजने के लिए कॉल पर कभी नहीं आएगा() विधि, फिर भी यह वैसे भी बचाया गया था।

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

यह बहुत निराशाजनक है और मैं किसी भी मदद के लिए आभारी हूं, क्योंकि मुझे लगता है कि यह निश्चित रूप से एक जटिल आवश्यकता नहीं होनी चाहिए!

+0

client.discard() इसे करने का तरीका होना चाहिए, क्या आप एकीकरण परीक्षण में समस्या को पुन: उत्पन्न कर सकते हैं? आप Grails का किस संस्करण का उपयोग कर रहे हैं? – leebutts

+0

मैंने अभी कोड पर एकीकरण परीक्षण की कोशिश की है, विचित्र रूप से पर्याप्त व्यवहार करना प्रतीत होता है जैसा कि मैं चाहता था लेकिन जब मैंने इसे सामान्य रूप से वेब के माध्यम से किया तो मुझे एक ही समस्या मिली। मैं अपना टेस्ट कोड पोस्ट करूंगा लेकिन मुझे यह नहीं पता कि यह कैसे करना है, यह मुझे बताता है कि यह बहुत सारे वर्ण हैं – user350325

+0

आपको नीचे दिए गए उत्तर को स्वीकार करना चाहिए! – oligofren

उत्तर

10

Grails वेब अनुरोध के अंत में आपके हाइबरनेट सत्र को बंद कर देता है, जो बदले गए ऑब्जेक्ट को बाहर कर देगा। ऑब्जेक्ट आपके हाइबरनेट सत्र से जुड़ा हुआ है क्योंकि आपने इसे हाइबरनेट (get()) के माध्यम से पकड़ लिया है। यदि आप परिवर्तन को फ़्लश करने से बचना चाहते हैं, तो आपको discard() का उपयोग करने की आवश्यकता है।

यह एक असफल सत्यापनकर्ता द्वारा स्वचालित रूप से किया जाता है, यही कारण है कि आपको सत्यापन विफलता के लिए ऐसा करने की आवश्यकता नहीं है।

हालांकि, आप इस तर्क को अपने ClientUser फ़ील्ड में से किसी एक पर कस्टम वैल्यूएटर पर ले जाकर कोड को सरल बना देंगे, जो स्वचालित रूप से विफलता पर ऑब्जेक्ट को त्याग देगा, या Grails कमांड ऑब्जेक्ट का उपयोग करके, जो भी encapsulate सत्यापन तर्क। फिर आप कमांड ऑब्जेक्ट पर त्रुटियों की जांच करेंगे।

+0

हां, लेकिन यह मुझे परेशान कर रहा है, मैं त्याग का उपयोग कर रहा हूं और यह एकीकरण परीक्षण पर काम कर रहा है लेकिन वेब पर नहीं – user350325

+1

याद रखें, एकीकरण परीक्षण अंत में आपके लेनदेन को वापस ले जाता है। वेब पर, आपका लेनदेन अंततः प्रतिबद्ध होगा। –

0

आप केवल फ्लैश कर रहे हैं जिनके पास वापस लेनदेन के साथ कुछ लेना देना नहीं है। त्रुटि फेंकने की स्थिति में RuntimeException और यह डेटाबेस में आपके परिवर्तन वापस रोल करेगा।

2

read विधि का उपयोग करें जो केवल पढ़ने योग्य राज्य में निर्दिष्ट आईडी के लिए डोमेन क्लास का एक उदाहरण पुनर्प्राप्त करता है।

Grails documentation about read देखें।

5

रीड-राइट मोड में डेटा प्राप्त करने के लिए प्राप्त करें() विधि का उपयोग करना, इसलिए यदि आप कुछ भी बदलते हैं तो यह जारी रहेगा। पढ़ने() विधि का उपयोग करें जो केवल पढ़ने के लिए मोड को पुनर्प्राप्त कर सकता है ताकि यदि आप कुछ भी बदलते हैं तो उपयोग करने की आवश्यकता है सहेजें() विधि। यह आपकी समस्या का समाधान करेगा।

इस http://grails.org/doc/latest/guide/GORM.html#basicCRUD

+0

यह मेरे लिए काम करता है हालांकि मुझे समझ में नहीं आता है कि अगर आप उपयोग करते हैं तो त्याग क्यों काम नहीं करती है, वैसे भी धन्यवाद – sttaq

0

एक अनुसंधान & डी के बाद पर एक नजर डालें, मैं यह पता लगाने की है कि हम की तरह एक पूरे सत्र स्पष्ट करने की जरूरत है:

session.clear() 

documentation के अनुसार:

सत्र को पूरी तरह से साफ़ करें। सभी लोड किए गए उदाहरणों को बेदखल करें और सभी लंबित बचत, अपडेट और हटाना रद्द करें। ओपन इटरेटर्स या स्क्रॉल करने योग्य रीसेट के उदाहरण बंद न करें।

हमें हाइबरनेट सत्र को ठीक तरह से साफ़ करने की आवश्यकता है। नतीजतन सत्र उपयोग योग्य राज्य में वापस आ गया है और भविष्य के उपयोग के लिए यह पहले की त्रुटि से प्रभावित नहीं होगा।