2014-01-08 33 views
1

我想了解Grails 2.3.4生成脚手架方法是如何执行验证的。例如,这是我的俱乐部领域产生什么样保存方法:Grails 2.3.4生成脚手架验证

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] } 
    } 
} 

从我的理解验证的第一阶段发生在数据绑定到拯救行动的俱乐部clubinstance参数。所以任何数据绑定错误都会被if(clubInstance.hasErrors())所捕获。

我没有看到显式调用clubInstance.validate()或对文档建议的任何错误检查clubInstance.save。它确实似乎工作。那么,如果有违反约束的情况,该方法如何验证并返回到视图?

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

回答

3

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

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

+0

一如既往地感谢Burt的解释。我没有意识到复杂的类型被视为Command对象。在你解释之后,我回到了关于数据绑定的文档,并发现:“有两类控制器动作参数,第一类是命令对象。”然后让我到Command:“在执行控制器动作之前,Grails会自动创建命令对象类的实例并通过绑定请求参数来填充它的属性。如果命令对象类被标记为Validateable,那么命令对象将会是验证“。 – bholl