2009-06-24 1 views
4

オブジェクト:Grailsの検証は私が最初のコードを表示した場合より簡単かもしれません、オブジェクトのリストの内容を検証するためにGrailsを取得しようとしている

class Item { 
    Contact recipient = new Contact() 
    List extraRecipients = [] 

    static hasMany = [ 
      extraRecipients:Contact 
    ] 

    static constraints = {} 

    static embedded = ['recipient'] 
} 

class Contact { 
    String name 
    String email 

    static constraints = { 
    name(blank:false) 
    email(email:true, blank:false) 
    } 
}  

基本的に私は何を持っていることは、単一であります連絡先(「受信者」)を必要と、これはうまく動作します:

def i = new Item() 
// will be false 
assert !i.validate() 
// will contain a error for 'recipient.name' and 'recipient.email' 
i.errors 

私が好きな何もそれはextraRecipients 'は、それに添付Contactオブジェクトのいずれかを検証します:

def i = new Item() 
i.recipient = new Contact(name:'a name',email:'[email protected]') 

// should be true as all the contact's are valid 
assert i.validate() 

i.extraRecipients << new Contact() // empty invalid object 

// should now fail validation 
assert !i.validate() 

これは可能ですか、コントローラのコレクションを繰り返し処理し、extraRecipientsの各オブジェクトのvalidate()と呼ぶだけですか?

答えて

8

質問を正しく理解している場合は、アイテムドメインオブジェクトにエラーが表示されるようにする(extraRecipientsプロパティのエラーとして、カスケードセーブスローにextraRecipients ?、右

もしそうなら、あなたはあなたのアイテムの制約にcustom validatorを使用することができますこのような何か(これはテストされていませんが、近いはずである):。

static constraints = { 
    extraRecipients(validator: { recipients -> 
     recipients.every { it.validate() } 
    }) 
} 

あなたがそれよりも手の込んだ得ることができますその受信者が失敗した結果のエラー文字列を潜在的に示すエラーメッセージそれを行う基本的な方法です。

+0

ありがとう、私は後で今夜それにbashを持っています –

+0

これは実際に動作し、私は使用しようとしている解決策だと思います。しかし、GrailsDomainClassValidatorをデバッグするのに少し時間を費やしてしまった場合、自動的にこれを行うべきであると思われ、私の場合は休止状態のプロキシクラスのために取得できません。 –

関連する問題