2013-08-30 61 views
0

我已经在网上搜索了将近一天,似乎无法找到解决我的问题的方法。
我有一个名为爱好的查找表,它有一堆爱好(野营,徒步旅行,骑自行车等)。兴趣表在引导期间填充。 Grails创建一个带有id和description字段的爱好表。grails渲染复选框列表

我有一个名为Applicant的域对象。申请人可以有零或更多的爱好。我已经声明了域这样的:

class Applicant { 

    static hasMany = [hobbies:Hobby] 
List <Hobby> hobbies = LazyList.decorate(new ArrayList(), FactoryUtils.instantiateFactory(Hobby.class)); 

}

在我的控制,我使用命令对象的页面将允许申请人选择自己的爱好。它被定义为:

class LifestyleCommand { 

    List <Hobby> hobbies = LazyList.decorate(new ArrayList(), FactoryUtils.instantiateFactory(Hobby.class)); 
} 

我GSP看起来像这样:

   <g:each var="item" in="${Hobby.list()}" status="i"> 

        <g:set var="newline" value="${(i % 3) == 0 ? 'newline' : ''}" /> 

        <div class="formcheckbox columns3 ${newline}"> 
         <g:checkBox name="hobbies_${item.id}" optionKey="id" value="${item.id}" /> 
         <label>${item.description}</label> 
        </div> 

       </g:each> 

该网页将正确显示页面中所有的爱好。但是,当我尝试将表单提交回控制器时,LifeStyleCommand对象中的列表为空。我不确定我的gsp是否正确设置了g:checkBox变量,并且我不确定是否正确地在命令对象中声明了List。一旦我将数据发送回控制器,我要克服的下一个问题就是将数据从命令对象复制到申请人。任何帮助,将不胜感激。

我试过在命令中只使用普通列表,但grails抱怨表单提交时的类型转换。

编辑:

这是我得到了什么工作:

class Applicant { 

    static hasMany = [hobbies:Hobby] 
//I removed the List <hobby>... code 
... 
} 

我的命令对象:

class LifestyleCommand { 
    Set <Hobby> hobbies; 
} 

GSP:

  <g:each in="${Hobby.list()}" var="hobby"> 
       <g:set var="checked" value="${ command?.hobbies.find{h->h.id == hobby.id } != null }" /> 
       <g:checkBox value="${checked}" name="${ 'hobby' +'[' + hobby.id + ']'}"/>${hobby.description}</td> 
      </g:each> 

而且我的新控制器代码:

Hobby.list().each{hobby-> 
    if (params["hobby[${hobby.id}]"] == 'on') { 
     applicant.addToHobbies(hobby) 
    } 
    else if (applicant.getHobbies().contains(hobby)) { 
     applicant.removeFromHobbies(hobby) 
    } 
} 

一切正常。可能有更好的方法,我还没有做过任何重构,但让它工作是一个起点。

+0

你可以发布你的控制器吗? – Alidad

+0

我想通过一些额外的研究,并注意我得到的例外。一个好的开始就是Google复选框组,虽然我不知道这个术语,但这正是我之前的想法。然后,我在这里找到了一篇关于Acegi插件示例的帖子:http://www.grails.org/AcegiSecurity%20Plugin%20-%20Basic%20Tutorial创建示例应用程序并查看创建用户的源代码。它涉及多个复选框,并且具有许多关系。从那里我必须让它在我的命令对象中工作。 – spock99

+0

首先,我从我的域和命令对象中删除这些行:列表兴趣爱好... – spock99

回答

2

问题出在您的GSP。当你需要的对象的列表,你必须为你的复选框保持标准名称:

<g:checkBox name="hobbies[$i].id" ... /> 

这将是正确映射到你的命令列表。