Моя проблема - это: Я хочу создать экземпляр домена чаш Грааля, определяя 'Много' экземпляры другого домена, который он имеет. У меня есть фактический источник в Google Code Project, но следующее должно проиллюстрировать проблему.
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;
Но мне нужен он для работы с флажками как это;
Вывод журнала является точно тем же! С обоими стилями формы Волонтерский экземпляр создается с Навыками, на которые правильно ссылаются в переменной 'Навыков'. При сохранении, последние сбои за исключением нулевой ссылки как показано во главе этого вопроса.
Надежда это имеет смысл, заранее спасибо!
Gav
Замените ваш create.gsp
код на:
<g:checkBox name="skill_${skillInstance.id}"/>
Затем внутри save
действия вашего контроллера замените def volunteerInstance = new Volunteer(params)
на :
def volunteerInstance = new Volunteer(name: params.name)
params.each {
if (it.key.startsWith("skill_"))
volunteerInstance.skills << Skill.get((it.key - "skill_") as Integer)
}
Должно работать. (код не тестировался)