Как использовать собственный валидатор в Grails

Я новичок в Grails. Я хотел бы использовать собственный валидатор для сопоставления двух паролей при регистрации в моем приложении. К сожалению, это не работает.

Account.groovy

@Validateable
class Account {

    String login
    String password
    String confirm
    String passwordHashed
    char active
    static transients = ['password', 'confirm']     
    static belongsTo = Employee
    static hasMany = [role:Role]

    static constraints = {
        login unique:true, blank: false
        active nullable: true
        password blank: false, size: 5..15, validator:{ val, obj ->
            if(obj.password != obj.confirm ){
                return ['dontmatch']
            }
        }       
    }

    static mapping = {
        id generator: 'increment'
    }
}

AuthenticationController.groovy

class AuthenticationController {

    def signUp(Account accountInstance){

        if(accountInstance!= null){
            if (accountInstance.hasErrors()) {
                respond accountInstance.errors, view:'signUp'
                return
            }
            else{
                accountInstance.save(flush: true)
            }
        }
    }

}

signUp.gsp

<%@ page import="com.sarna.entity.Account"%>
<%@ page import="com.sarna.entity.Employee"%>
<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="bootstrap-main" />
<title>SARNA</title>
</head>
<body>
    <br />
    <div class="container">
        <div style="margin-top: 50px"
            class="mainbox col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">
            <div class="panel panel-info">
                <div class="panel-heading">
                    <div class="panel-title">Sign Up</div>
                    <div
                        style="float: right; font-size: 85%; position: relative; top: -10px">
                        <a id="signinlink"
                            href="${createLink(uri: '/authentication/signIn') }">Sign In</a>
                    </div>
                </div>
                <div class="panel-body">
                    <g:form class="form-horizontal" role="form"
                        url="[resource: accountInstance]"
                        method="POST" controller="Authentication">


                        <g:hasErrors bean="${accountInstance}">
                            <div class="alert alert-danger">
                                <g:renderErrors bean="${accountInstance}" />
                            </div>
                        </g:hasErrors>
                        <div class="form-group">
                            <label for="email" class="col-md-3 control-label">Email</label>
                            <div class="col-md-9">
                                <input type="text" class="form-control" name="email"
                                    placeholder="Email Address">

                            </div>
                        </div>


                        <div class="form-group">
                            <label for="icode" class="col-md-3 control-label">Login</label>
                            <div class="col-md-9">
                                <g:textField type="text" class="form-control" name="login"
                                    required="" value="${accountInstance?.login }"
                                    placeholder="Login" />

                            </div>
                        </div>

                        <div class="form-group">
                            <label for="password" class="col-md-3 control-label">Password</label>
                            <div class="col-md-9">

                                <g:passwordField name="password"
                                    class="form-control ${hasErrors(bean:accountInstance,field:'password','errors')}"
                                    placeholder="Password" />
                            </div>
                        </div>

                        <div class="form-group">
                            <label for="icode" class="col-md-3 control-label">Confirm</label>
                            <div class="col-md-9">
                                <g:passwordField
                                    class="form-control ${hasErrors(bean:accountInstance,field:'password','errors')}"
                                    name="confirm" placeholder="Confirm Password" />
                            </div>
                        </div>

                        <div class="form-group">
                            <!-- Button -->
                            <div class="col-md-offset-3 col-md-9">

                                <g:actionSubmit action="signUp"
                                    class="btn btn-lg btn-success btn-block" value="Sign Up" />
                            </div>
                        </div>
                    </g:form>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

сообщения.свойства

account.password.dontmatch=Podane hasła muszą się zgadzać

Я этого не понимаю. Я ввожу два разных пароля и нажимаю кнопку «Зарегистрироваться», но не вижу сообщений об ошибках, которые должны отображаться при сбое проверки. Не могли бы вы помочь мне?


person Tasmanski    schedule 30.08.2014    source источник


Ответы (3)


Вызов validate() отсутствует:

if (!accountInstance.validate() || accountInstance.hasErrors()) {
  ...
}
person injecteer    schedule 31.08.2014

Сопоставьте фактическое значение из validator со свойством confirm из фактического объекта.

password blank: false, size: 5..15, validator:{ val, obj ->
    if( obj.confirm && val != obj.confirm ) { // val is password
        return ['dontmatch']
    }
}
person dmahapatro    schedule 30.08.2014
comment
Спасибо за ответ, но, к сожалению, что-то не так. На мой взгляд, я не получаю никаких сообщений о том, что пароли неверны. Есть ли у меня какая-то ошибка в моем действии регистрации или просмотре регистрации? - person Tasmanski; 30.08.2014

Я думаю, вместо respond в контроллере вы хотите

render (view: "signUp", model: [accountInstance: accountInstance])

Ваше представление ожидает, что объект accountInstance в модели представления будет отображать ошибки, поэтому вы должны предоставить его.

Вы также можете просто сделать

return [accountInstance: accountInstance]

Если есть gsp с тем же именем, что и текущее действие, Grails автоматически отобразит его.

person Martin Hauner    schedule 30.08.2014