Grails - Простая hasMany проблема - Используя CheckBoxes, а не Выбор HTML в create.gsp

Моя проблема - это: Я хочу создать экземпляр домена чаш Грааля, определяя 'Много' экземпляры другого домена, который он имеет. У меня есть фактический источник в 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 для этих двух Контроллеров затем Вы заканчиваете с формой как это, которое не работает;

Scaffolding

Моя собственная попытка заставить это работать перечисляет Навыки как флажки и похожа на это;

Custom Create.gsp

Но когда я сохраняю Волонтера, навыки являются пустыми!

Failed to save Skills

Это - код для моего метода сохранения;

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

7
задан gav 10 May 2010 в 20:37
поделиться

1 ответ

Замените ваш 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)
}

Должно работать. (код не тестировался)

5
ответ дан 6 December 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: