我对grails相对较新,并且在检查多个列表项时,一直在尝试配置复选框以将布尔值设置为true。
关系是两个域之间的hasMany,其中boolean canEdit在工作域中设置。另一个域称为角色。 我已经建立了关系,以便工作hasManyRoles,我希望我的域能够根据复选框列表中的内容,将某些角色的boolean canEdit设置为true。
我已经设法让gsp工作显示列表,每个列表旁边都有复选框,但我不确定如果检查一些这些角色后如何将布尔值保存为true,因为当前它们都被设置为true,无论哪个检查。
非常感谢任何帮助。我将在下面发布我的代码:
class Work {
static hasMany = [canEditRole: Role]
String name = "Default"
Boolean canEdit = false
static constraints = {
name blank: false, unique: true
canEdit nullable: true
}
boolean canEdit(Role role){ // not sure the best way to check for if the role is associated, this was something I tried with te default add method.
if(canEdit){
addToCanEditRole(role)
}
return canClose
}
}
class WorkController{
def save(Long id, String canEdit) {
def work = Work.get(params.id)
def roleToCheck = Role.findByName(params.roleNames)
Boolean roleCanEdit = canEdit ? true : false
if(roleCanEdit){
workflow.canEdit(roleToCheck)
println "role is " + roleToCheck
}else{
println "no roles added"
}
}
}
GSP代码段:
<tr class="prop">
<td valign="top" class="name">
<label for="canEdit">Allow Role to Edit</label>
</td>
<td valign="top" style="text-align: left;"
class="value ${hasErrors(bean: WorkInstance, field: 'canEdit', 'errors')}">
<ul>
<g:each in="${roleNames}" var="role">
<li>
<g:checkBox name="canEdit" value="${WorkInstance?.canEdit}"/> <label>${role.name}</label>
</li>
</g:each>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
<div class="buttons">
<span class="button"><g:actionSubmit class="save" action="save"
params="[roleName: roleNames.name]"
value="${message(code: 'default.button.update.label', default: 'Update')}"/></span>
</div>
答案 0 :(得分:0)
你看过grails.plugin.springsecurity.ui.UserController ?看来您想要的功能已经存在。
protected Map buildUserModel(user) {
Set userRoleNames = user[authoritiesPropertyName].collect { it[authorityNameField] }
def granted = [:]
def notGranted = [:]
for (role in sortedRoles()) {
String authority = role[authorityNameField]
if (userRoleNames.contains(authority)) {
granted[(role)] = userRoleNames.contains(authority)
}
else {
notGranted[(role)] = userRoleNames.contains(authority)
}
}
[roleMap: granted + notGranted, tabData: tabData, user: user]
}
然后在您的gsp中,您可以访问roleMap
,如:
<g:each var="entry" in="${roleMap}">
<div class="form-group">
<label class="col-xs-4">
<g:link controller='role' action='show' id='${entry.key.id}'>
${entry.key.authority.encodeAsHTML()}
</g:link>
</label>
<div class="col-xs-8">
<g:checkBox name="${entry.key.authority}" value="${entry.value}"/>
</div>
</div>
</g:each>