Граальс пустой записи в базе данных - PullRequest
0 голосов
/ 09 января 2012

Я пытался создать / сохранить сразу несколько экземпляров в Grails, теперь я почти со следующим кодом, но когда я нажимаю сохранить, создается пустая строка опций, может кто-нибудь помочь мне с этим, пожалуйста, посмотритеэти два вопроса, чтобы увидеть, чего я хочу достичь

Как сохранить несколько объектов из одного представления, используя Grails

Представление Grails один ко многим

<g:textField name="question" value="${multipleChoiceQuestionInstance?.question}"/><br/>
  <div class="fieldcontain ${hasErrors(bean: multipleChoiceQuestionInstance, field: 'options', 'error')} ">
    <label for="options">
      <g:message code="multipleChoiceQuestion.options.label" default="Options" />

    </label>

    <ul class="one-to-many">
      <g:set var="counter" value="${0}" />
      <g:each  status="i" in="${multipleChoiceQuestionInstance?.options?}" var="o">
        <li>
        <g:textField controller="multipleChoiceOption" name="options[${i}].answerOption" action="show" id="${o.id}" value="${o?.encodeAsHTML()}"/>
        <g:checkBox name="options[${i}].correctOption" value="${o.correctOption}"/><br/>
        </li>
        <g:set var="counter" value="${++counter}" />
      </g:each>
      <li>
      <g:textField name="options[${++counter}].answerOption" value=""/>
      <g:checkBox name="options[${counter}].correctOption" /><br/>
      </li>
      <li class="add">
      <g:link controller="multipleChoiceOption" action="create" params="['multipleChoiceQuestion.id': multipleChoiceQuestionInstance?.id]">${message(code: 'default.add.label', args: [message(code: 'multipleChoiceOption.label', default: 'MultipleChoiceOption')])}</g:link>
      </li>
    </ul>

  </div>

Если вы предпочитаете не нажимать на ссылку здесь, это доменные классы

Class MultipleChoiceQuestion {
    String question
    static constraints = {
        ...
    }
    static hasMany = [options:MultipleChoiceOption]

class MultipleChoiceOption{
    String answerOption
    boolean correctOption
    MultipleChoiceQuestion question
    static constraints = {
        ...
    }
}

   }

Я использую автоматически сгенерированный код Grails для контроллера, это как показано ниже

    def create() {
        [multipleChoiceQuestionInstance: new MultipleChoiceQuestion(params)]
    }

    def save() {
        println params
        def multipleChoiceQuestionInstance = new MultipleChoiceQuestion(params)
        if (!multipleChoiceQuestionInstance.save(flush: true)) {
            render(view: "create", model: [multipleChoiceQuestionInstance: multipleChoiceQuestionInstance])
            return
        }

        flash.message = message(code: 'default.created.message', args: [message(code: 'multipleChoiceQuestion.label', default: 'MultipleChoiceQuestion'), multipleChoiceQuestionInstance.id])
        redirect(action: "show", id: multipleChoiceQuestionInstance.id)
    }

def update() {
        def multipleChoiceQuestionInstance = MultipleChoiceQuestion.get(params.id)
        if (!multipleChoiceQuestionInstance) {
            .... //deleted for real estate
            return
        }

        if (params.version) {
             //version checking stuff
            }
        }

        multipleChoiceQuestionInstance.properties = params

        if (!multipleChoiceQuestionInstance.save(flush: true)) {
            render(view: "edit", model: [multipleChoiceQuestionInstance: multipleChoiceQuestionInstance])
            return
        }

        flash.message = message(code: 'default.updated.message', args: [message(code: 'multipleChoiceQuestion.label', default: 'MultipleChoiceQuestion'), multipleChoiceQuestionInstance.id])
        redirect(action: "show", id: multipleChoiceQuestionInstance.id)
    }

1 Ответ

0 голосов
/ 09 января 2012

Причина, по которой вы получаете пустую строку опций, заключается в том, что вы оставляете текстовое поле с именем опции [counter] пустым. Это пустое значение передается как параметр в действие контроллера, и оно создает новую строку с этими пустыми значениями.

Вы должны удалить все пустые опции перед вызовом

multipleChoiceQuestionInstance.properties = params

Вы можете использовать что-то вроде этого:

def emptyOptions = params.options.findAll{!it.answerOption}
params.options.removeAll(emptyOptions)
...