2012-01-09 35 views
-1

我一直努力嘗試在Grails中一次創建/保存多個實例,現在我幾乎在那裏使用下面的代碼,但是當我點擊保存創建一行空行時,是否有人可以幫我這個 請參閱以下兩個問題,看我想要的東西,實現Grails empy進入數據庫

How to save multiple object from one view using Grails

Grails one to many relationship view

<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> 

如果您不喜歡點擊這裏是域CLA的SSE

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) 
    } 
+0

請張貼代碼你在哪裏保存您的實體 – 2012-01-09 11:18:34

+0

你沒有真的告訴我們你的問題是什麼,你現在看到什麼樣的行爲,以及你想看到什麼樣的行爲。我不認爲有太多人會仔細閱讀這兩個其他問題,以便弄清楚GSP代碼試圖實現的是什麼。此外,您之前已經針對此項目https://github.com/leadVisionary/Grails-Survey-Module,其中包含此問題的解決方案。有沒有關於你不喜歡的解決方案? – 2012-01-09 11:19:23

+0

@AnujArora請檢查我的編輯 – Sap 2012-01-09 11:25:40

回答

0

,你得到的選擇一個空行的原因是因爲你離開一個文本框名稱選項[計數器]爲空。該空值作爲參數傳遞給控制器​​操作,並用這些空值創建一個新行。

調用

multipleChoiceQuestionInstance.properties = params

您可以使用這樣的事情之前,您應該刪除任何空白選項:

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