Grails コントローラー内の更新アクションに問題があります。
パスワード (またはその確認) を変更してフォームを送信するときは、それを検証したいと思います。十分に確認されていない場合は、フォームを拒否してユーザーに警告する必要があります。これに関する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)
}