2013-08-30 62 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" ... /> 

這將是正確映射到你的命令列表。