【问题标题】:grails one-to-many dynamic form submittinggrails 一对多动态表单提交
【发布时间】:2014-12-11 15:51:43
【问题描述】:

我的应用程序中有以下域:

class Sport implements Serializable {

    Set terms

    static hasMany = [terms: Term]

    static mapping = {
        terms cascade: "all-delete-orphan"
    }
}

class Term implements Serializable {
    String term
    String tagCode
    Sport sport

    static constraints = {

        sport nullable: false

    }
    static belongsTo = [sport: Sport]
    static mapping = {
        table "terms"
        sport cascade: "save-update,merge"
    }

}

及SportController更新方法:

 @Transactional
    def update(Sport sport) {
        def sportInstance = sportService.update(sport)
        ....
    }

我也有 edit.gsp,我可以在其中通过 JavaScript 动态添加/删除术语,并且我对它们有以下命名约定:

<ul>
   <li>
       <g:textField id="term${i}" name="terms[${i}].term"
          required=""
          value="${term?.term}"/>
   </li>
   <li>
        <g:textField id="synonym${i}"
          name="terms[${i}].synonym"
          value="${term?.synonym}"/>

   </li> 
</ul>

当我添加新术语并提交 edit.gsp 时,一切正常:在 SportController.update() 方法中,sport.terms Set 包含新的术语实例,并且没有问题。但是当我从编辑页面中删除一个术语并提交页面时,在 SportController.update() 方法中,sport.terms Set 仍然包含在页面上删除的 Term 实例。我确定这个 Term 实例没有提交(我检查了请求并且它没有包含它)所以我怀疑 Grails 正在以某种方式获取它以及 Sport 实例,但我不要求这样做。也许你有类似的经历?你能帮我解决这个问题吗?我已经花了大约 5 个小时来解决它。谢谢!

【问题讨论】:

    标签: grails grails-orm grails-domain-class grails-controller


    【解决方案1】:

    其中一个选项是将Set terms 转换为List terms,这会使GORM 在每个save() 上删除并重新创建集合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多