3

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)
}
4

1 に答える 1

5

userInstanceアクションが成功した後の自動フラッシュにより、あなたは救われると思います。userInstance.discard()パスワードが一致しない場合は、returnステートメントの前に使用してみてください。このようにして、このインスタンスをHibernateから切り離すと、アクション後に保存されなくなります。

于 2012-08-16T13:58:12.960 に答える