2011-05-09 14 views
6

Ben onun alanlarından birine oluşturulduktan gün sonra bir tarih olması gerekir etki alanı sınıf var sadece oluşturmak için geçerli yapabilirsiniz.Grails: Bir doğrulayıcı (/ düzenle güncellemek değil)

class myClass { 
    Date startDate 
    String iAmGonnaChangeThisInSeveralDays 
    static constraints = { 
    iAmGonnaChangeThisInSeveralDays(nullable:true) 
    startDate(validator:{ 
     def now = new Date() 
     def roundedDay = DateUtils.round(now, Calendar.DATE) 
     def checkAgainst 
     if(roundedDay>now){ 
      Calendar cal = Calendar.getInstance(); 
      cal.setTime(roundedDay); 
      cal.add(Calendar.DAY_OF_YEAR, -1); // <-- 
      checkAgainst = cal.getTime(); 
     } 
     else checkAgainst = roundedDay 

     return (it >= checkAgainst) 
    }) 
    } 
} 

Yani birkaç gün sonra sadece dize değiştirmek ve doğrulayıcı tarihini yeniden denetlemek çünkü kaydetme başarısız kaydetmek arayıp geçmişte şimdi olduğu zaman. Doğrulayıcıyı yalnızca oluştururken tetiklenecek şekilde ayarlayabilir miyim, yoksa oluşturduğumuz veya düzenlediğimizi/güncellediğimizi tespit etmek için onu değiştirebileceğim bir yol var mı?

@Rob H Cevabını nasıl kullanılacağını tamamen emin değilim. Ben bu hataya neden aşağıdaki kodu vardır:

myInstance.iAmGonnaChangeThisInSeveralDays = "nachos" 
myInstance.save() 
if(myInstance.hasErrors()){ 
    println "This keeps happening because of the stupid date problem" 
} 
+0

hiç startDate' sonra güncellenir 'Eğer durum olacak İlk kaydetme? –

+0

Asla değişmemeli. – Mikey

cevap

12
id yeni bir kalıcı olmayan örnek olsun bir göstergesi veya varolan kalıcı örneği olarak ayarlanmış olup olmadığını kontrol edebilirsiniz

:

startDate(validator:{ date, obj -> 
    if (obj.id) { 
     // don't check existing instances 
     return 
    } 
    def now = new Date() 
    ... 
} 
+0

Tam olarak ihtiyacım olan şey buydu + oldukça hoş bir hack. – Mikey

0

Bir seçenek doğrulanması istediğiniz özellikleri belirtmek için olabilir. documentation Gönderen:

The validate method accepts an optional List argument which may contain the names of the properties that should be validated. When a List is passed to the validate method, only the properties defined in the List will be validated.

Örnek: Bazı yerleşik Grails iyilik atlayarak konum beri

// when saving for the first time: 
myInstance.startDate = new Date() 
if(myInstance.validate() && myInstance.save()) { ... } 

// when updating later 
myInstance.iAmGonnaChangeThisInSeveralDays = 'New Value' 
myInstance.validate(['iAmGonnaChangeThisInSeveralDays']) 
if(myInstance.hasErrors() || !myInstance.save(validate: false)) { 
    // handle errors 
} else { 
    // handle success 
} 

Bu, biraz hacky hissediyor. Yalnızca save() numaralı telefonu arayacak olursanız normalde gerçekleşecek olan alanda gerekli herhangi bir doğrulamayı atlamadığınız konusunda ihtiyatlı olmak isteyeceksiniz. Daha zarif olanlar varsa başkalarının çözümlerini görmek isterdim.

Not: bunu önlemek için Gerçekten save(validate: false) kullanılmasını önermiyoruz. Bunu nasıl kullandığınıza çok dikkat etmedikçe, yolda beklenmeyen olumsuz sonuçlara yol açacak. Bir alternatif bulabilirseniz, bunun yerine tüm bunları kullanın.

+0

Bunu nasıl kullanacağınızdan tamamen emin değilsiniz; lütfen düzenlememi orijinal soruma bakın. – Mikey

+1

@Mikey - Cevabımı güncelledi. Doğru olduğundan emin olmak için hızlı bir test yapmam gerekiyor. Değilse, bunu zaten kendiniz yaptıktan sonra validate() 'yi çağırmaktan kaçınmak için 'kaydet (validate: false)' işlevini kullanmak için güncellenebilir. –

+0

@Mikey - Bazı testler yaptıktan sonra başka bir güncelleme yaptık. Belki sizin için çalışacaktır. –