Grails bug?更新操作会忽略rejectValue

时间:2012-08-16 13:40:39

标签: grails controller

我在Grails控制器中遇到更新操作时遇到问题。

当我提交带有密码(或其确认)的表格时,我希望对其进行验证,如果没有得到很好的确认,我应该拒绝该表格并警告用户。我正在尝试按照Grails doc说明(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)
}

1 个答案:

答案 0 :(得分:4)

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