web-dev-qa-db-ja.com

Grailsでカスタムエラーメッセージを含むカスタムバリデーターを作成するにはどうすればよいですか?

Grailsでカスタムバリデーターを作成し、カスタム文字列をビューとエラーメッセージに戻すにはどうすればよいですか?

たくさんの人が同じように立ち往生しているのを見たので、それに対処するための質問と回答を作成することにしました。

19
Spider

ステップ1:ドメインオブジェクトまたはコマンドオブジェクトを作成し、それにカスタム制約を設定します...

_@grails.validation.Validateable
class PeopleCommand {

    String  firstName 
    String  lastName
    String  emailAddress
    String  idNumber

    static constraints = {
        firstName (blank: false)
        lastName  (blank: false)
        emailAddress  (blank: false)
        idNumber  (blank: false, size: 13..16, validator: {value, object ->
                if (!value.startsWith('77')) return false;
        })
    }
}
_

これにより、入力したidNumberが77で始まるかどうかがチェックされます。そうでない場合は、エラーが送信されます。次の質問、エラーをどのように表示しますか?

ステップ2:エラーを表示するようにビューをカスタマイズする

_<div class="${hasErrors(bean:person,field:'idNumber','error')}">
    <label class="control-label">Identity Number</label>
    <input value="${fieldValue(bean:person,field:'idNumber')}" name="idNumber" type="text"/>
    <div class="error-messages">
        <g:renderErrors bean="${command}" as="list" field="idNumber"/>   
    </div>
</div>
_

上記の例では、人物モデルオブジェクトのidNumberフィールドにエラーがある場合、${hasErrors(bean:person,field:'idNumber','error')}は文字列errorをhtmlクラスに追加します。このクラスを使用して、入力のスタイルを設定し、_div.error-messages_ブロックを表示および/または非表示にすることができます。 _<g:renderErrors bean="${command}" as="list" field="idNumber"/>_は恐ろしいエラーメッセージを表示します。

ステップ3:セクシーなカスタムメッセージを作成する

[〜#〜] important [〜#〜]:Grailsでは、ビューに直接メッセージを送信することはできません。代わりに、/ i18n/messages.properties(メッセージバンドル)でメッセージを宣言する必要があります。好きなキーを使用できます。

Messages.properties内

_validation.idStartsWith77=Your ID number must start with 77
_

バリデーターで

_idNumber  (blank: false, size: 13..16, validator: {value, object ->
    return 'validation.idStartsWith77'
})
_

これにより、referenceがビューに渡され、messages.propertiesのカスタムメッセージがポイントされます。

ステップ4:システムをハッキングして、メッセージをビューに直接渡すことができるようにします

これは、特にnot多言語Webサイトを開発している人々にのみ適用されます。

Grailsを使用すると、カスタムパラメータをパーサーに渡すことができます。メッセージファイル内でこれらのカスタムパラメータを参照できます。システムをごまかすために、メッセージ全体が1つのカスタムパラメータであるカスタムメッセージを作成できます。など:

Messages.properties内

_validation.customRuntimeMessage={3}
_

バリデーターで

_idNumber  (blank: false, size: 13..16, validator: {value, object ->
    return ['validation.customRuntimeMessage', 'You need to start your ID with 77']
})
_
34
Spider

カスタム検証を行う代わりに、カスタム制約を作成してGrailsに接続することもできます。

http://www.zorched.net/2008/01/25/build-a-custom-validator-in-grails-with-a-plugin/

2