我已經在網上搜索了將近一天,似乎無法找到解決我的問題的方法。
我有一個名爲愛好的查找表,它有一堆愛好(野營,徒步旅行,騎自行車等)。興趣表在引導期間填充。 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)
}
}
一切正常。可能有更好的方法,我還沒有做過任何重構,但讓它工作是一個起點。
你可以發佈你的控制器嗎? – Alidad
我想通過一些額外的研究,並注意我得到的例外。一個好的開始就是Google複選框組,雖然我不知道這個術語,但這正是我之前的想法。然後,我在這裏找到了一篇關於Acegi插件示例的帖子:http://www.grails.org/AcegiSecurity%20Plugin%20-%20Basic%20Tutorial創建示例應用程序並查看創建用戶的源代碼。它涉及多個複選框,並且具有許多關係。從那裏我必須讓它在我的命令對象中工作。 – spock99
首先,我從我的域和命令對象中刪除這些行:列表興趣愛好... –
spock99