2010-09-28 64 views
1

是否有可能在grails中編寫自己的驗證器,以便返回有效的對象?從grails約束驗證返回域對象

喜歡的東西:

static constraints = { 
    name(validator: {val, obj -> 
     if (Drink.findByName(val)) return [Drink.findByName(val)] 
    }) 
} 

換句話說 - 如果飲料在DB已經存在,只是返回現有之一,當有人做了

新的飲料(「可樂」)

和可樂已經在數據庫中

回答

2

你不能用自定義驗證器來做到這一點。這不是真正意義上的。從Grails Reference

的封閉可以返回:

  • nulltrue,表明值是有效的
  • false表示一個無效的值,並使用默認的消息代碼
  • 一個字符串指示要附加到「classname.propertName」的錯誤代碼。用於解決錯誤消息的字符串。如果無法解析特定於字段的消息,則會解析錯誤代碼本身以允許全局錯誤消息。
  • 包含上述字符串的列表,以及隨後的任意數量的參數,它們可用作3以後索引的格式化消息參數。請參閱grails-app/i18n/message.properties以查看默認錯誤消息代碼如何使用參數。

另一種方法可能是創建一個服務方法,該方法1)查找域並在存在時返回它,2)否則保存域並返回它。

可能有更優雅的選擇。無論如何,Grails的約束機制不是(也不應該)能夠做到這一點。

+0

好 - 謝謝!我希望有一個優雅的解決方案。我看到了這個參考,但並不確定它是如何包容它的 – Derek 2010-09-28 19:57:38

+0

是的。最終,如果你使用服務或域名方法來做到這一點,將來會更容易維護,所以你可能會更好。 – 2010-09-28 20:09:08

0

不知道是否可以從內部驗證做到這一點,但:

飲料d = Drink.findOrSaveWhere(名稱: '平滑飲料',alcoholLevel: '4.5')