Вот как я это делаю.Где-нибудь, сделайте этот метод доступным.
def getRoleMap(userInstance) {
List roles = Role.list()
roles.sort { r1, r2 ->
r1.authority <=> r2.authority
}
Set userRoleNames = []
if (userInstance.id) {
for (role in userInstance.authorities) {
userRoleNames << role.authority
}
}
LinkedHashMap<Role, Boolean> roleMap = [:]
for (role in roles) {
roleMap[(role)] = userRoleNames.contains(role.authority)
}
return roleMap
}
Затем вызовите этот метод и перенаправьте его в представление как [roleMap: roleMap]
Ваше представление выглядит следующим образом ..
<div class='role-map' style="width: 300px; height: 200px; overflow:auto;border: 1px solid black">
<g:each in="${roleMap}">
<div>
<g:checkBox name="userRoles" value="${it.key.authority}" checked="${it.value}"/>
${it.key.authority.encodeAsHTML()}
</div>
</g:each>
</div>
Затем, когда пользователь сохраняется, вы можете сделать следующее:
UserRole.removeAll(user)
params.userRoles.roleAuthorities.each { roleAuthority ->
UserRole.create(user, Role.findByAuthority(roleAuthority))
}