Grails保存方法,如果出现错误

时间:2017-07-27 23:42:15

标签: grails gsp

我有两种创建新域名的方法:

第一个是修改后的 create()方法,而不是仅响应使用表单中的参数创建的子域(在newSubDomain视图内),它还将userDomainList传递给gsp,所以我可以从中创建一个选择。

def newSubDomain() {
        def currentUser = springSecurityService.getCurrentUser() 
        def domainList = currentUser.domains //an hasMany domain for user
        def subDomain = new SubDomain(params)
        [subDomain: subDomain, domainList: domainList ] 
    }

第二个是 save()方法

def saveSubDomain(SubDomain subDomain) {

    if (subDomain== null) {
        notFound()
        return
    }

    if (subDomain.hasErrors()) {
        respond subDomain.errors, view:'newSubDomain'
        return
    }

    subDomain.save flush: true    

    redirect(controller: "controller", action: "action")               
}

SubDomain必须具有唯一的名称,如果我创建一个具有相同名称的SubDomain,我希望它在newSubDomain视图的顶部显示错误消息,这种情况会发生,但是当他回想起传递错误的方法时,它会重新加载和/或传递" domainList"所以他无法在视图中加载选择。

这是 newSubDomain.gsp 视图代码的一部分

<g:hasErrors bean="${this.subDomain}">
        <ul class="errors" role="alert">
            <g:eachError bean="${this.subDomain}" var="error">
                <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li>
            </g:eachError>
        </ul>
    </g:hasErrors>


    <g:form controller="subDomain " action="saveSubDomain">

        <f:field bean="subDomain " property="name"/>
        <br>
        <f:field bean="subDomain" property="domain">
        <g:select name="domain"
                  from="${domainList}"
                  optionKey="id"
                  optionValue="name"
        />
    </f:field>

        <g:actionSubmit value="Save sub Domain" action="saveSubDomain"/>
    </g:form>

我做错了什么?我不太了解grails(或一般的Web应用程序)那里有更好的方法来传递参数来从控制器查看?为什么当我遇到错误时再次调用newSubDomain视图时没有通过domainList?

1 个答案:

答案 0 :(得分:0)

在newSubDomain中,您封送domainList的数据,并为newSubDomain视图提供一个新的子域供其使用。

在saveSubDomain中,该方法仅接收子域对象。发现错误时,saveSubDomain控制器方法使用它具有的数据将用户发送回newSubDomain视图 - 但saveSubDomain方法没有填充的domainList变量。因此视图没有要显示的domainList数据。