Acegi / Spring Securityプラグインを使用してGrailsでWebアプリを作成していますが、ユーザーインスタンスに加えた変更を確認するのに問題があります。私はGroovy/Grailsを使って約3週間しか働いていません。その答えを見つけるためにメーリングリストやチュートリアルをじっくり見てきたので、この問題が些細なものである場合はご容赦ください。
反対の推奨事項が見つからなかったため、ユーザーに電子メール確認トークンや本名などの詳細情報を含める必要がある場合は常に、ユーザードメインクラスに新しい属性を追加しています。新しいユーザーを作成するにはすべて問題ないようですが、ユーザーを編集すると、変更はユーザーリストに表示されますが、Acegiタグライブラリと関連する関数には変更が表示されないようです。
UserController.update()の関連するスニペットは次のとおりです。
def person = User.get(params.id)
//...snip error checking...
//Update user attributes
person.username = params.email
person.email = params.email
person.userRealName = params.userRealName
//Attempt to save changes
if (person.save()) {
//If successful, redirect back to profile viewing page
redirect action: show, id: person.id
return
}
else {
//Otherwise, show errors and edit again
render view: 'edit', model: buildPersonModel(person)
return
}
このコードを実行した後、常にIDでユーザーデータを取得している場合は変更を確認できますが、Acegiタグまたは関数を使用している場合は確認できません。たとえば、これは機能しません。
loggedInUserInfo(field:'realName')
しかし、これはします:
User.get(loggedInUserInfo(field:'id').toLong()).realName
新しい情報は、ログアウトして再度ログインした後に表示されることがありますが、通常は表示されず、3回以上再ログインしても表示されないことがよくあります。また、person.save()に「flush:true」を追加しても効果はありません。
(一般的な質問:このようにUserクラスをいじるのは悪いことですか?そうでない場合、それに情報を追加するための最良の方法は何ですか?)
さらに調査した後の更新: 通常のページでloggedInUserInfo()を使用すると正常に機能するように見えますが、レイアウト内で使用すると、説明した動作を示します。奇妙なキャッシングが起こっている可能性はありますか?