我的問題是這樣的:我想創建一個grails域實例,定義它擁有的另一個域的'Many'實例。我有一個Google Code Project的實際來源,但下面應該說明問題。Grails - 簡單的hasMany問題 - 使用CheckBox而不是HTML在create.gsp中選擇
class Person {
String name
static hasMany[skills:Skill]
static constraints = {
id (visible:false)
skills (nullable:false, blank:false)
}
}
class Skill {
String name
String description
static constraints = {
id (visible:false)
name (nullable:false, blank:false)
description (nullable:false, blank:false)
}
}
如果使用兩個控制器的這種模式和def scaffold
那麼你最終像這樣不工作形式;
我自己的努力得到這個工作,列舉了技能複選框,看起來像這樣;
但是當我保存志願者的技能爲空!
這是我的保存方法的代碼;
def save = {
log.info "Saving: " + params.toString()
def skills = params.skills
log.info "Skills: " + skills
def volunteerInstance = new Volunteer(params)
log.info volunteerInstance
if (volunteerInstance.save(flush: true)) {
flash.message = "${message(code: 'default.created.message', args: [message(code: 'volunteer.label', default: 'Volunteer'), volunteerInstance.id])}"
redirect(action: "show", id: volunteerInstance.id)
log.info volunteerInstance
}
else {
render(view: "create", model: [volunteerInstance: volunteerInstance])
}
}
這是我的日誌輸出(我有自定義的toString()方法);
2010-05-10 21:06:41,494 [http-8080-3] INFO bumbumtrain.VolunteerController - Saving: ["skills":["1", "2"], "name":"Ian", "_skills":["", ""], "create":"Create", "action":"save", "controller":"volunteer"]
2010-05-10 21:06:41,495 [http-8080-3] INFO bumbumtrain.VolunteerController - Skills: [1, 2]
2010-05-10 21:06:41,508 [http-8080-3] INFO bumbumtrain.VolunteerController - Volunteer[ id: null | Name: Ian | Skills [Skill[ id: 1 | Name: Carpenter ] , Skill[ id: 2 | Name: Sound Engineer ] ]]
請注意,在最終的日誌行中,正確的技能已被選中並且是對象實例的一部分。當志願者被保存時,'技能'被忽略,並且沒有被提交到數據庫,儘管內存版本顯然確實具有這些項目。在施工時是否無法通過技能?這一定有辦法嗎?我需要一個表單來允許一個人註冊,但我想規範化數據,以便我可以在稍後添加更多技能。
如果您認爲這應該「正常工作」,那麼指向一個工作示例的鏈接將會很好。
如果我使用HTML選擇,那麼它工作正常!如下面做出Create頁面;
<tr class="prop">
<td valign="top" class="name">
<label for="skills"><g:message code="volunteer.skills.label" default="Skills" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: volunteerInstance, field: 'skills', 'errors')}">
<g:select name="skills" from="${uk.co.bumbumtrain.Skill.list()}" multiple="yes" optionKey="id" size="5" value="${volunteerInstance?.skills}" />
</td>
</tr>
但我需要它,像這樣複選框工作;
<tr class="prop">
<td valign="top" class="name">
<label for="skills"><g:message code="volunteer.skills.label" default="Skills" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: volunteerInstance, field: 'skills', 'errors')}">
<g:each in="${skillInstanceList}" status="i" var="skillInstance">
<label for="${skillInstance?.name}"><g:message code="${skillInstance?.name}.label" default="${skillInstance?.name}" /></label>
<g:checkBox name="skills" value="${skillInstance?.id.toString()}"/>
</g:each>
</td>
</tr>
日誌輸出完全一樣!在「技能」變量中正確引用技能的情況下創建了志願者實例的兩種樣式。保存時,後者將失敗,並顯示空引用異常,如本問題頂部所示。
希望這是有道理的,在此先感謝!
GAV株系
救命稻草!這是如此頭痛 – gav 2010-05-17 10:43:13
歡迎您:-) – fabien7474 2010-05-17 16:33:05
小優化it.key.startsWith比it.key.contains – mmigdol 2011-11-01 07:40:24