контроллеры Grails отображают ошибки в нескольких классах домена - PullRequest
0 голосов
/ 19 мая 2011

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

class CarroMovel {
    String move
    String rodas
    String espelhos
    Carro carro

    static hasMany = [carros: Carro]
    static belongsTo = Carro

    static constraints = {
        move(nullable:false, blank:false)
    }

    static mapping = {
        version false
    }
}

класс Carro {

String name
String marca
String matricula

static constraints = {
    name(nullable:false, blank:false)
}

static mapping = {
    version false
}

}


def save3 = {

        def carroInstance = new Carro( )
        def carroMovelInstance = new CarroMovel( )

        carroInstance.name = params.carro.name
        carroInstance.marca = params.carro.marca
        carroInstance.matricula = params.carro.matricula

        carroMovelInstance.move = params.carroMovel.move
        carroMovelInstance.rodas = params.carroMovel.rodas
        carroMovelInstance.espelhos = params.carroMovel.espelhos

        carroInstance.save(failOnError: true)

        carroMovelInstance.carro = carroInstance
        carroMovelInstance.save(failOnError: true)

    }

<g:form controller="carro" action="save3">
<h1>Add New Carro Record</h1>
<p>Basic Information</p>

<label>Name
<span class="small">Add your name</span>
</label>
<input type="text" name="carro.name" value="${carroInstance?.name}" /><br>

<label>Marca
<span class="small">Add your name</span>
</label>
<input type="text" name="carro.marca" value="${carroInstance?.marca}" /><br

  <label>Matricula
<span class="small">Add your name</span>
</label>
<input type="text" name="carro.matricula" value="${carroInstance?.matricula}" /><br>

<label>Move
<span class="small">Add your name</span>
</label>
<input type="text" name="carroMovel.move" value="${carroMovelInstance?.move}" /><br>

<label>Rodas
<span class="small">Add your name</span>
</label>
<input type="text" name="carroMovel.rodas" value="${carroMovelInstance?.rodas}" /><br>

<label>Espelho
<span class="small">Add your name</span>
</label>
<input type="text" name="carroMovel.espelhos" value="${carroMovelInstance?.espelho}" /><br>

<g:submitButton name="save" value="Save" id="addConference"/>


<div class="spacer"></div>
  </g:form>

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

1 Ответ

1 голос
/ 19 мая 2011

Учебник ошибок проверки Grails

Ошибки для объекта домена хранятся в свойстве errors, которое добавляется к объекту после его проверки.Это свойство является реализацией интерфейса Spring Errors .

Вы можете получить ошибки, вызвав методы этого интерфейса напрямую, например, чтобы отобразить ошибки для поля move поляCarro экземпляр:

List<FieldError> moveErrors = carroMovelInstance.errors?.getFieldErrors('move')   

Чтобы получить сообщения об ошибках для каждой ошибки, вам потребуется ссылка на компонент messageSource, созданный Grails.Вы можете получить сообщение для каждой из вышеуказанных ошибок с помощью:

List<String> errorMessages = moveErrors.collect {error -> 
    messageSource.getMessage(error, Locale.default) 
}

В качестве альтернативы Grails предоставляет теги eachError и renderErrors, которые упрощают отображение ошибок и соответствующих сообщений в GSP.


Конкретные проблемы с вашим кодом

В коде вашего контроллера будет возникать исключительная ситуация при сбое save из-за ошибок проверки, поэтому представление не может отображать ошибки.Чтобы исправить это, измените контроллер так, чтобы он возвращал доменные объекты (вместе с их ошибками), когда сохранение не удается

def save3 = {

    def carroInstance = new Carro( )
    def carroMovelInstance = new CarroMovel( )

    carroInstance.name = params.carro.name
    carroInstance.marca = params.carro.marca
    carroInstance.matricula = params.carro.matricula

    carroMovelInstance.move = params.carroMovel.move
    carroMovelInstance.rodas = params.carroMovel.rodas
    carroMovelInstance.espelhos = params.carroMovel.espelhos

    // I'm assuming in the code below that the view that displays the form is 'create.gsp'
    if (!carroInstance.save()) {
        render view: 'create', model : [carro: carroInstance, carroMovel: carroMovelInstance]
        return
    }

    carroMovelInstance.carro = carroInstance

    if (!carroMovelInstance.save()) {
        render view: 'create', model : [carro: carroInstance, carroMovel: carroMovelInstance]
    }

}

Необходимо также изменить GSP, чтобы отображать эти ошибки с помощью API Errorsнепосредственно или один из тегов Grails (см. выше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...