2012-05-29 16 views
5

Bir yer oluşturmak için bir formum var. Ülkeye bağlı olarak il (eyalet, bölge) alanı gereklidir veya yapılmamaktadır.Grails koşullu nullable validasyon veya nullable seçeneği ile özel validator

Ne zaman gerekli değil, boş dizge boş değil, boş olmak istiyorum. yer etki alanında, ben ilin bir doğrulayıcı sahip, Şimdi

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() 

: Ben boş tüm boş form alanlarını kılacak yöntem var hep olsun, bu kural ile

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

"vilayet Gerekli olmasa bile, boş olamaz.

Bunun nedeni varsayılan olarak yanlış olarak ayarlanan geçersiz değerli doğrulayıcı olmasıdır.

Ben null ekliyorum ise

: true, sonra il gerekse de, özel doğrulayıcı atlanır ve boş ili ile kaydetmek mümkündür edilir Şimdi

(Ben null örneği olur çünkü olduğunu düşünüyorum)

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

nasıl Grails 2.0.3 yılında bunu başarabilirsiniz: ben, nedense böyle bir şey benim özel doğrulayıcı ve benim doğrulayıcı null belirtmek için de yeteneği gerekir?

cevap

4

Yaptığınız kodla anlatamam ancak sorun, varsayılan doğrulamanın ilin boş olmasına izin vermemesi durumunda, ilin boş bırakılmasına izin vermeye çalıştığınız var mı? Her alan için birden çok doğrulayıcıya izin verilir. Yani tekrar orijinal kodda, tıpkı iyi null doğrulayıcı belirtmeyen:

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

DÜZENLEME: özel teşhis ve onaylama , ayrıca eğer durumda boş olmak obj karşı korumak isteyebilirsiniz.

EDIT2: grails üzerinde 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'] 
    }) 
    } 
} 

Kontrolörü çalışan yukarıdaki doğrulama gösteren Demo projesi ...

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

Yani fikrin ı çağırabilir nerede bir kukla denetleyicisi olması Örneğinize benzer bir Place etki alanı örneği oluşturmak için kodlanmış dizin eylemi. Uyarı Sadece ülke dizgisini tanımladım, böylece özel doğrulama için mantığımı değiştirebilirim. Yer örneğini oluştururken ili tanımlamadım, bu nedenle boş olması gerekir. Place'ten gerçek kısıtlamayı beklendiği gibi, o zaman hata boş değerdir: Bu senaryoya göre, tepki sayfa ben Nullable kaldırırsanız

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

... Aşağıdaki ...

Çıktı pasajını yazdırır ... Ben çalışıyoruz 2 çözümler öğrendim

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

Yanıtınız için teşekkür ederiz, ancak bir sorun var. Eğer null ve place.province değerine ayarlanmış olursam, özel doğrulama tamamen atlanır. Bazı ülkeler için null olmak istiyorum ama diğerlerinde olmamak istiyorum. – Eduard

+0

Açık olması gerekirse: eğer null değeri true olarak değil ve dosyalanmış ise null ise, "null olamaz" hatası ve özel doğrulayıcı benim yürütülmez. NULLLAble eklerseniz: true ve değer boş, doğrulama geçer, özel doğrulayıcı benim yürütülmez. Bazı ülkeler için boş ve başkaları için boş olmamak istiyorum. Bu şu anki davranışla yapamadığım bir şey. – Eduard

+0

Belki de bir 2.0.3 hata grails. Ben 2.0.4 çalıştıran ve benim için çalışıyorum basit bir demo proje ile çalışıyorum Ben – Tri

12

araştırma ve geribildirim bir sürü sonra

Çıktı pasajı .... Bir kontrolörde.modelinde herhangi doğrulama ekleyin ve denetleyici dinamik bunları eklemeyin:

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 
    } 

}

diğer çözüm bu thread Tri önerdiği biridir, ancak başka (null kısıtlaması önce özel doğrulayıcı koymak Özel değerleyici için boş değer çağrılmaz.):

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