Я пишу веб-приложение на Grails с помощью плагина Acegi / Spring Security, и у меня возникают проблемы с его просмотром изменений, вносимых в экземпляры пользователей. Я работаю с Groovy / Grails только около трех недель, поэтому, пожалуйста, простите меня, если эта проблема тривиальна, так как я перебираю списки рассылки и учебники, пытаясь найти ответ.
Я добавляю новые атрибуты в класс домена пользователя всякий раз, когда мне нужно, чтобы пользователь содержал дополнительную информацию, такую как токен подтверждения по электронной почте или настоящее имя, поскольку я не мог найти никаких рекомендаций об обратном. Кажется, все хорошо для создания новых пользователей, но когда я редактирую пользователя, изменения отображаются в списке пользователей, но библиотеки тегов 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
}
После запуска этого кода я могу видеть изменения, если всегда получаю пользовательские данные по идентификатору, но нет, если я использую теги или функции Acegi. Например, это не работает:
loggedInUserInfo(field:'realName')
Но это так:
User.get(loggedInUserInfo(field:'id').toLong()).realName
Новая информация иногда появляется после того, как я выхожу из системы и снова, но обычно это не так, часто не показывая даже после трех или более повторных регистраций. Также я попытался добавить «flush: true» в person.save () безрезультатно.
(Периферийный вопрос: не плохо ли мне возиться с классом User, подобным этому? Если нет, как лучше добавить информацию в него?)
Обновление после дополнительного расследования:
Похоже, что если я использую loggedInUserInfo () на обычной странице, он работает нормально, но если я использую его внутри макета, он демонстрирует поведение, которое я описал. Может ли происходить какое-то странное кеширование?