g:复选框不会单独为列表项保存选中的项目

时间:2016-02-15 19:38:17

标签: grails checkbox

我对grails相对较新,并且在检查多个列表项时,一直在尝试配置复选框以将布尔值设置为true。

关系是两个域之间的hasMany,其中boolean canEdit在工作域中设置。另一个域称为角色。 我已经建立了关系,以便工作hasManyRoles,我希望我的域能够根据复选框列表中的内容,将某些角色的bo​​olean 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>

1 个答案:

答案 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>