1

我试图了解 Grails 2.3.4 生成的脚手架方法如何执行验证。例如,这是为我的 Club 域保存方法生成的:

def save(Club clubInstance) {
    if (clubInstance == null) {
        notFound()
        return
    }

    if (clubInstance.hasErrors()) {
        respond clubInstance.errors, view:'create'
        return
    }

    clubInstance.save flush:true

    request.withFormat {
        form {
            flash.message = message(code: 'default.created.message', args: [message(code: 'clubInstance.label', default: 'Club'), clubInstance.id])
            redirect clubInstance
        }
        '*' { respond clubInstance, [status: CREATED] }
    }
}

据我了解,验证的第一阶段发生在数据绑定到保存操作的 Club clubinstance 参数上。所以任何数据绑定错误都会在 if (clubInstance.hasErrors()) 上被捕获。

如文档所示,我没有看到对 clubInstance.validate() 的显式调用或对 clubInstance.save 的任何错误检查。然而,它似乎确实有效。那么如果存在约束冲突,该方法如何验证并返回视图呢?

更重要的是,我们不应该使用生成的脚手架控制器作为在 Grails 中执行基本 CRUD 的最佳实践方式吗?

4

1 回答 1

3

当您在控制器操作方法中包含参数时,Grails 将为它们进行数据绑定。对于字符串、数字、布尔值等简单类型,参数名称与参数名称相匹配,如果存在匹配和合理的方式将参数字符串转换为请求的类型,则为您完成。

对于复杂类型,参数被视为命令对象。如果它在控制器类中定义,它在编译时通过 AST 转换使其可验证。如果该类是在其他地方定义的(例如 src/groovy),则必须使用注释对其进行grails.validation.Validateable注释,如果它是域类,那么它显然是可验证的。在任何情况下,在创建实例并绑定数据之后,都会为您调用 validate()。

于 2014-01-08T19:33:03.107 回答