Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Ошибки проверки не отображаются в представлении

Автор вопроса: CesarОтветов: 1

Мне трудно понять эту проблему проверки. У меня есть один класс родительского домена, определенный следующим образом:

class Person {
    String fullName
    List telephones = []

    static hasMany = [telephones : Telephone]

    static constraints = {
        fullName(size:3..50, blank:false, nullable:false)
    }
}

Затем подкласс:

class SalesAdvisor extends Person{
    Float comission //In percentage
    Portfolio customerPortfolio
    Inventory inventory

    static constraints = {
        comission(range:0..100, scale:2, nullable:false)
        customerPortfolio(nullable:false)
        inventory(nullable:false)
    }
}

В SalesAdvisorController я сохраняю экземпляры SalesAdvisor:

def save = {
    def portfolio = new Portfolio()
    def inventory = new Inventory(name:'${params.fullName}Inventory', description:"${params.fullName}'s Inventory")
    params.customerPortfolio = portfolio
    params.inventory = inventory
    def salesAdvisor = new SalesAdvisor(params)

    if(!salesAdvisor.hasErrors() && salesAdvisor.save()){
        log.info("New instance of SalesAdvisor saved.")
        redirect(action:show, id:salesAdvisor.id)
    }else{
        log.error("There was an error saving the sales advisor.")
        salesAdvisor.errors.allErrors.each{
        println it.code
    }
    render(view:'create', model:[salesAdvisor:SalesAdvisor])
  }
}

Чтобы отобразить любые ошибки, в представлении "создать" у меня есть:

<g:hasErrors bean="${salesAdvisor}">
    <div class="errors">
        <g:renderErrors bean="${salesAdvisor}" as="list" />
    </div>
</g:hasErrors>

Проверка вроде работает нормально. Однако, если я отправлю строку вместо числа с плавающей запятой для поля комиссии, в журналах я увижу "typeMismatch", но представление ничего не отображает! В файле message.properties есть запись по умолчанию для typeMismatch. То же самое для поля fullName, в журналах я вижу ошибки "nullable" и "blank", но представление ничего не отображает.

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

error-handlingvalidationgrailsgroovy

Ответы

Ответ 1 · рейтинг 2 · Daniel Rinser

Я бы сказал, что проблема заключается в простой опечатке в вашем коде передачи модели:

render(view:'create', model:[salesAdvisor:SalesAdvisor])

(обратите внимание на значение SalesAdvisor в верхнем регистре). Пытаться

render(view:'create', model:[salesAdvisor:salesAdvisor])

В качестве примечания, в вашем коде построения Inventory есть ошибка:

name:'${params.fullName}Inventory'

Здесь вы должны использовать двойные кавычки (GString).

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы