2012-05-29 15 views
5

के साथ कस्टम सत्यापनकर्ता मेरे पास एक स्थान बनाने के लिए एक फॉर्म है। देश के आधार पर, प्रांत (राज्य, क्षेत्र) क्षेत्र की आवश्यकता है या नहीं।ग्रेल्स सशर्त नाली योग्य सत्यापन या निरर्थक विकल्प

जब आवश्यक नहीं है, तो मैं खाली होना चाहता हूं, खाली स्ट्रिंग नहीं।

def newparams = [:] 
     place = new Place() 
     params.each() { k, v -> 
      if (v instanceof String && place.hasProperty(k)) { 
       if (!v.trim().length()) { 
        newparams[k] = null 
       } else { 
        newparams[k] = v 
       } 
      } 
     } 

     place = new Place(newparams) 
     place.validate() 

अब, जगह डोमेन, मैं प्रांत पर एक सत्यापनकर्ता है:: मैं कोड है कि सभी खाली प्रपत्र फ़ील्ड्स बना देता है, अशक्त है

province validator: {val, obj -> if (obj.country in obj.requiresRegionCountries() && !obj.province) return [province.required]} 
इस नियम के साथ

, मैं हमेशा मिलता है "प्रांत शून्य नहीं हो सकता है "भले ही यह आवश्यक हो या नहीं।

मुझे लगता है कि ऐसा इसलिए है क्योंकि शून्य करने योग्य सत्यापनकर्ता जो गलत पर सेट है।

मैं नल द्वारा जोड़ा जा रहा है: सच है, तो भले ही प्रांत की आवश्यकता है, कस्टम सत्यापनकर्ता को छोड़ दिया जाता है और यह खाली प्रांत के साथ को बचाने के लिए संभव है (मुझे लगता है कि है, क्योंकि यह शून्य वाले instantiated हो जाता है)

अब

province validator: {val, obj -> 
    if (obj.country in obj.requiresRegionCountries() && !obj.province) { 
    nullable: false 
    return [province.required] } 
    else { 
    nullable: true 
    } 
} 

मैं कैसे Grails 2.0.3 में इस लक्ष्य को हासिल कर सकते हैं:, मैं किसी भी तरह अपने कस्टम सत्यापनकर्ता और भी मेरी सत्यापनकर्ता में नल निर्दिष्ट करने की क्षमता, कुछ इस तरह की जरूरत है?

उत्तर

4

मैं आपके द्वारा चिपकाए गए कोड के साथ नहीं बता सकता लेकिन यदि आपकी समस्या यह है कि डिफ़ॉल्ट सत्यापन प्रांत को शून्य होने की अनुमति नहीं देता है, तो क्या आपने स्पष्ट रूप से प्रांत को शून्य होने की अनुमति देने की कोशिश की है? आपको प्रत्येक फ़ील्ड के लिए एकाधिक सत्यापनकर्ताओं की अनुमति है। तो अपने मूल कोड में वापस आ गया है, बस नल सत्यापनकर्ता साथ ही निर्दिष्ट करें:

province nullable: true, validator: {val, obj -> 
    if (obj != null && obj.country in obj.requiresRegionCountries() && !obj.province) 
    return [province.required] 
} 

संपादित करें: कस्टम सत्यापनकर्ता में, भी अगर हालत में अशक्त जा रहा है obj से सुरक्षा के लिए चाहते हो सकता है।

EDIT2: डेमो ऊपर grails पर काम कर रहा 2.0.4

class Place { 
String country 
Province province 

    static constraints = { 
    province (nullable: true, validator: {val, obj -> 
     if (obj.country == 'Canada' && !val) return ['province.required'] 
    }) 
    } 
} 

नियंत्रक मान्यता दिखा परियोजना ...

class MainController { 
    def index() { 
    def place = new Place(country: 'Canada') 
    if (!place.validate()) { 
     render "need province<br/>" + place.errors 
    } else { 
     render "cool" 
    } 

तो विचार है कि मैं एक डमी नियंत्रक है मैं कहाँ आह्वान कर सकते हैं है इंडेक्स एक्शन जो आपके उदाहरण के समान प्लेस डोमेन इंस्टेंस बनाने के लिए हार्डकोड किया गया है। नोटिस मैंने केवल देश स्ट्रिंग को परिभाषित किया है ताकि मैं कस्टम सत्यापन के लिए उस पर अपना तर्क कुंजी कर सकूं। प्लेस इंस्टेंस बनाने के दौरान मैंने प्रांत को परिभाषित नहीं किया था, इसलिए यह शून्य होना चाहिए। कि परिदृश्य के तहत, प्रतिक्रिया पेज निम्नलिखित ...

आउटपुट टुकड़ा प्रिंट होगा ...

need province 
grails.validation.ValidationErrors: 1 .... does not pass custom validation] 

अगर मैं नल निकालें: प्लेस से सच बाधा है, तो त्रुटि शून्य मान अपेक्षा के अनुरूप है ...

आउटपुट टुकड़ा ...

need province 
grails.validation.ValidationErrors: 1 .... cannot be null] 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन एक समस्या है। अगर मैं शून्य और जगह बन गया हूं। प्रोविन्स शून्य है, तो कस्टम सत्यापन पूरी तरह से छोड़ दिया जाता है। मैं कुछ देशों के लिए बेकार होना चाहता हूं लेकिन दूसरों में नहीं। – Eduard

+0

स्पष्ट होने के लिए: यदि मैं शून्य को सही नहीं डालता हूं और दायर शून्य है, तो त्रुटि "शून्य नहीं हो सकती" त्रुटि है और मेरा कस्टम सत्यापनकर्ता निष्पादित नहीं किया गया है। अगर मैं शून्य जोड़ता हूं: सत्य और मान शून्य है, सत्यापन पास हो जाएगा, मेरा कस्टम सत्यापनकर्ता निष्पादित नहीं किया जाएगा। मैं कुछ देशों के लिए शून्य होना चाहता हूं और दूसरों के लिए शून्य नहीं हूं। यह ऐसा कुछ है जो मैं वर्तमान व्यवहार से नहीं कर सकता। – Eduard

+0

शायद यह एक grails 2.0.3 बग है। मैं 2.0.4 चला रहा हूं और यह मेरे लिए एक साधारण डेमो प्रोजेक्ट के साथ काम कर रहा है, मैंने बनाया है कि मैं ऊपर दिए गए मेरे उत्तर में पेस्ट करूंगा ताकि आप – Tri

12

अनुसंधान और प्रतिक्रिया के बहुत सारे के बाद मुझे 2 समाधान है कि काम कर रहे हैं पता चला। एक नियंत्रक में है।मॉडल में किसी भी मान्यता जोड़ने न करें और उन्हें नियंत्रक का उपयोग करके डायनामिक जोड़ें:

class PlacesController { 
    def create() { 
    def place = new Place(params.address) 
    if (place.country in placesThatRequiresProvinceArray) { 
     place.constrains.province.nullable = false 
    } else { 
     place.constrains.province.nullable = true 
    } 

}

अन्य समाधान इस सूत्र में त्रि द्वारा प्रस्तावित है, लेकिन (किसी और नल बाधा से पहले कस्टम सत्यापनकर्ता डाल कस्टम सत्यापनकर्ता को शून्य मानों के लिए नहीं कहा जाएगा):

static constraints = { 
    province (validator: {val, obj -> 
    if (obj.country == 'Canada' && !val) 
     return ['province.required'] 
    }, nullable: true) 
} 

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

  • कोई संबंधित समस्या नहीं^_^