2012-04-16 75 views
0

假設我有一個User類,它具有username屬性,並且在此字段上定義了幾個約束。獲取失敗約束的名稱

class User { 
    String username 

    static constraints = { 
     username blank: false, unique: true, email: true 
    } 
} 

如果我打電話

user.save() 

然後我就可以計算出,如果任何對username場的約束通過

user.errors['username'] != null 

失敗,但有什麼辦法,我可以找出哪些的約束失敗?

+1

不知道你可以...也許可以從'user.errors [「用戶名」] code'做得出來? – 2012-04-16 20:41:12

回答

2

user.errors['username'].codes將包含許多用於在messages.properties中查找驗證消息的密鑰。您可以使用這些來確定哪些約束被破壞。

例如,user.errors['username'].codes[-1]將包含messages.properties密鑰的限制部分:

assert user.errors['username'].codes[-1] == 'blank' // if blank constraint fails 
assert user.errors['username'].codes[-1] == 'unique' // if unique constraint fails 
2

葉氏,你可以用code屬性檢查錯誤代碼的錯誤對象:

def user = new User(email: '') 
user.validate() 
assert user.errors['email'].code == 'blank' 

user.email = 'asdasd' 
user.validate() 
assert user.errors['email'].code == 'email.invalid' 

如果您可能有一個以上的屬性錯誤,我發現獲得該屬性的所有錯誤的唯一方法是迭代allErrors屬性:

class Foo { 
    String bar, baz 
    static constraints = { 
     bar blank: false 
     baz email: true, notEqual: 'foobar' 
    } 
} 

def foo = new Foo(bar: '', baz: 'foobar') 
foo.validate() 
foo.errors.allErrors.each { 
    println "$it.field: $it.code" 
} 

應該輸出類似:

bar: blank 
baz: notEqual 
baz: email.invalid