2

文字列の国が「usa」であるかどうかを確認する必要がある文字列状態のカスタムバリデーターを追加しようとしています。状態は「その他」である必要があります。国が「米国」ではなく、州が「その他」の場合、エラーがスローされます。

また、同じことを行うために国のカスタムバリデーターを追加したいと思います。

以下のドメイン クラスのコードを見つけてください。

package symcadminidp

import java.sql.Timestamp

import groovy.transform.ToString

@ToString
class Account {

static auditable = [ignore:['dateCreated','lastUpdated']]

String organization
String organizationUnit 
String status
String address1
String address2
String zipcode
String state
String country

Timestamp dateCreated
Timestamp lastUpdated

Account(){
    status = "ENABLED"
}


static hasMany = [samlInfo: SAMLInfo, contacts: Contact]
static mapping = {
    table 'sidp_account_t'
    id column: 'account_id', generator:'sequence', params:[sequence:'sidp_seq']
    contacts cascade:'all'
    accountId generator:'assigned'

    organization column:'org'
    organizationUnit column:'org_unit'
    zipcode column:'zip'
    dateCreated column:'date_created'
    lastUpdated column:'date_updated'
}
static constraints = {
    organization size: 1..100, blank: false
    organizationUnit size: 1..100, blank: false, unique: ['organization']
    //The organizationUnit must be unique in one organization 
    //but there might be organizationUnits with same name in different organizations, 
    //i.e. the organizationUnit isn't unique by itself.
    address1 blank:false
    zipcode size: 1..15, blank: false
    contacts nullable: false, cascade: true
    status blank:false
    //state ( validator: {val, obj ->  if (obj.params.country.compareTocompareToIgnoreCase("usa")) return (! obj.params.state.compareToIgnoreCase("other"))})
        //it.country.compareToIgnoreCase("usa")) return (!state.compareToIgnoreCase("other"))}
}
}

上記のコメントアウトされたコードを追加しようとすると、次のエラーが発生しました。

URI: /symcadminidp/account/index クラス: groovy.lang.MissingPropertyException メッセージ: そのようなプロパティはありません: クラスのパラメーター: symcadminidp.Account

私はgrailsとgroovyが初めてで、この問題について何か助けていただければ幸いです。

4

1 に答える 1

3

バリデータ ( obj ) の 2 番目の値は Account ドメイン クラスです。

カスタムバリデーターは、最大 3 つのパラメーターを取る Closure によって実装されます。Closure がゼロまたは 1 つのパラメーターを受け入れる場合、パラメーター値は検証されるものになります (ゼロパラメーター Closure の場合は "it")。2 つのパラメーターを受け入れる場合、1 つ目は値で、2 つ目は検証されるドメイン クラス インスタンスです。

http://grails.org/doc/latest/ref/Constraints/validator.html

あなたのバリデーターは次のようなものでなければなりません

state validator: { val, obj -> 
    return ( obj.country.toLowerCase() == 'usa' ) ?
           ( val.toLowerCase() != 'other' ) : 
           ( val.toLowerCase() == 'other' ) 
}   
于 2012-07-31T23:53:30.940 に答える