2012-08-16 72 views
2

我遇到了Grails控制器内更新操作的问题。Grails bug?更新操作忽略rejectValue

当我提交一个密码更改的表单(或其确认)时,我想要验证它,如果它没有得到很好的确认,我应该拒绝表单并警告用户。我试图按照这个Grails文档说明(http://grails.org/doc/latest/ref/Domain%20Classes/errors.html)。

当我只更改密码或确认时,一切正常。

但是,当我改变其他东西,然后在窗体中的密码,即使验证密码的块显然很好地执行,对象(userInstance)仍然更新时,问题来了。而且,不仅其他数据是持久的,而且还是“不确定”的密码。

我试图在下面的示例代码中插入一些'printlns'来说明会发生什么。我正在使用Grails 2.0.0并在IntelliJ 11.1.3中进行调试(如果有帮助的话)。

我希望已经足够清楚。

感谢您的任何答案。

def update() { 
    ... 

    if (params.password != params.confirmPassword) { 
     println("This message is correctly printed when passwords differ.") 
     userInstance.errors.rejectValue('password', 
             'defaut.password.diff.message', 
             'Password confirmation is incorrect!') 
     render(view: "edit", model: [userInstance: userInstance]) 
     return 
    } 

    println("This message is correctly NOT printed when passwords differ.") 
    println("But 'userInstance' object is updated in DB anyways. :(") 

    if (!userInstance.save(flush: true)) { 
     render(view: "edit", model: [userInstance: userInstance]) 
     return 
    } 

    flash.message = message(code: 'default.updated.message', args: [message(code: 'utilisateur.label', default: 'Utilisateur'), utilisateurInstance.id]) 
    redirect(action: "show", id: utilisateurInstance.id) 
} 

回答

4

我认为您的userInstance是因为成功操作后自动刷新保存的。如果密码不匹配,请在返回语句前尝试使用userInstance.discard()。这样你就可以从Hibernate中分离出这个实例,并且在一个动作之后它不会被保存。

+0

Thanks Tomasz!这就是它。 – mateuscpf 2012-08-16 14:59:34