Моя проблема заключается в следующем: я хочу создать экземпляр домена grails, определив множество экземпляров другого домена, который у него есть. У меня есть фактический источник в Проекте Google Code , но следующая проблема должна проиллюстрировать эту проблему.
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 Select, тогда он работает нормально! Например, чтобы создать страницу Create *; 1034 *
<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>
Вывод журнала абсолютно одинаков! При использовании обоих стилей формы экземпляр Volunteer создается с навыками, правильно указанными в переменной «Skills». При сохранении последнее завершается ошибкой с исключением нулевой ссылки, как показано в верхней части этого вопроса.
Надеюсь, это имеет смысл, заранее спасибо!
Гав