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

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

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», но представление ничего не отображает.

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


person Cesar    schedule 22.06.2009    source источник


Ответы (1)


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

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

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

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

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

name:'${params.fullName}Inventory'

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

person Daniel Rinser    schedule 22.06.2009
comment
Я не дома, поэтому не могу попробовать, но я всегда думал, что при передаче модели в представление (через карту модели) ключ в том, как представление будет обращаться к значению, а значение - это домен класс? Но теперь я вижу, что значение должно быть самим экземпляром. - person Cesar; 22.06.2009
comment
Ну, я думаю, что термин модель немного перегружен и, следовательно, неоднозначен. Обычно вы ссылаетесь на модель предметной области (часто поддерживаемую базой данных и инфраструктурой ORM) как на модель (M в MVC). Карта, которую вы передаете из действия контроллера в представление, на самом деле является чем-то другим. Хотя он часто содержит экземпляры классов модели предметной области, вы вовсе не ограничены этим. Вы можете передать любые значения, которые хотите/должны использовать в своем представлении. В вашем случае тег renderErrors ожидает, что salesAdvisor (bean=${salesAdvisor}) будет экземпляром класса домена (тот, который может содержать ошибки). - person Daniel Rinser; 22.06.2009