Grails, Custom Validatable объект для обновления - PullRequest
1 голос
/ 07 апреля 2020

У меня есть пользовательская проверка для моих пользователей. Это работает хорошо, но для создания, но я сталкиваюсь с ошибкой, когда я хочу обновить пользователя. Есть некоторые поля, которые недоступны в разделе обновления, такие как имя пользователя, пароль и адрес электронной почты, и эти поля не должны быть нулевыми.

import grails.validation.Validateable

class UserCommand implements Validateable {
    Long id
    String firstName
    String lastName
    String username
    String password
    String email
    UserStatus status = UserStatus.CREATED


    static constraints = {
        firstName nullable: false, blank: false
        lastName nullable: false, blank: false
        username nullable: false, blank: false, validator: { val, obj ->
            if (obj.id) {
                if (User.countByUsernameAndIdNotEqual(val,obj.id)) {
                    return "user.already.exist"
                }
            } else {
                if (User.countByUsername(val)) {
                    return "user.already.exist"
                }
            }
        }
        password nullable: false, blank: false
        email nullable: false, blank: false, validator: { val, obj ->
            if (obj.id) {
                if (User.countByEmailAndIdNotEqual(val,obj.id)) {
                    return "user.already.exist"
                }
            } else {
                if (User.countByEmail(val)) {
                    return "user.already.exist"
                }
            }
        }
    }
}

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

    def update(UserCommand command) {
        if(command.validate()) {
            try {
                user = userService.update(command)
            } catch (ValidationException e) {
                respond user.errors, view: 'edit'
                return
            }
        }
    }

, а это edit.gsp:


<!DOCTYPE html>
<html>
<head>
    <title>Edit information</title>
    <meta name="layout" content="main"/>
    <asset:stylesheet src="bootstrap.css" rel="stylesheet"/>
</head>
<body>
<g:form resource="${this.user}" controller="user" action="update" method="put">
    <div class="container">
        <div class="row">
            <div class="col-md-6">
                <div class="inputWithIcon">
                    <input type="text" class="custom-input" name="firstName" placeholder="First Name" value="${this.user.firstName}">
                    <i class="fa fa-id-badge fa-lg fa-fw" aria-hidden="true"></i>
                </div>
            </div>
            <div class="col-md-6">
                <div class="inputWithIcon">
                    <input type="text" class="custom-input" name="lastName" placeholder="Last Name" value="${this.user.lastName}">
                    <i class="fa fa-id-card fa-lg fa-fw" aria-hidden="true"></i>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-md-4">
                <div class="inputWithIcon">
                    <input type="text" class="custom-input" name="country" placeholder="Country" value="${this.user.country}">
                    <i class="fa fa-globe fa-lg fa-fw" aria-hidden="true"></i>
                </div>
            </div>
            <div class="col-md-8">
                <div class="inputWithIcon">
                    <textarea  type="text" class="custom-input" name="address" placeholder="Address" rows="3">${this.user.address}</textarea>
                    <i class="fa fa-address-card fa-lg fa-fw" aria-hidden="true"></i>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-md-12">
                <button type="submit" class="custom-button edit">Update</button>
            </div>
        </div>

    </div>
</g:form>
</div>
</body>
</html>

Каков наилучший способ справиться с валидациями (возможно, Я не совсем поняла) и как решить эту проблему?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Возможно, вы тоже делаете это нелегко.

Они могут быть встроены в ваш класс пользователя GORM, что избавляет вас от необходимости создавать отдельный объект CommandObject.

Хотя я почти уверен, что вы это знали. Я просто помещаю это здесь для тех, кто может искать эту топи c.

0 голосов
/ 08 апреля 2020

Я думаю, что вы можете захотеть сделать это загрузить UserCommand в методе update, обновить поля на основе входящих параметров.

Так что вместо вашего метода обновления что-то вроде

def update() {
    UserCommand command = UserCommand.get(params.id)
    command.firstName = params.firstName // and more based on whatever you can update

    if(command.validate()) {
        try {
            user = userService.update(command)
        } catch (ValidationException e) {
            respond user.errors, view: 'edit'
            return
        }
    }
}

В вашем файле edit.gsp в <input type='hidden'/> также могут быть все не подлежащие обновлению поля, но я предпочитаю не отправлять подобные данные, так как кто-то со злым умыслом все еще может их обновить. поля довольно легко с помощью инспектора DOM или аналогичного.

...