我有以下域:

class Attribute {
  static hasMany = [attributeParameters: AttributeParameter]
}

class AttributeParameter {

   String value
   Integer sequenceNo
   static belongsTo = [attribute: Attribute]
}

我有一个表单,我要在其中显示一个属性的所有现有AttributeParameters,并允许用户填充其值并单击Save。在保存时,需要更新每个AttributeParameter(已经有一个ID)。

我目前在为创建此功能所需的HTML方式上空白。我已经试过了:

代码简化为清晰:
<form>
  <input type="hidden" name="attributeParameters[0].id" value="1" />
  <input type="text" name="attributeParameters[0].value" value="1234567" />
  <input type="hidden" name="attributeParameters[1].id" value="2" />
  <input type="text" name="attributeParameters[1].value" value="name" />
</form>

def save() {
  def attribute = Attribute.get(params.id)
  attribute.properties = params
}

并且它正确地填充了集合,但是由于在保存之前未获取AttributeParameter,因此无法正常工作,因此失败并出现错误:



更新:

我将HTML修改为以下内容:
<form>
  <input type="hidden" name="attributeParameters.id" value="1" />
  <input type="text" name="attributeParameters.value" value="1234567" />
  <input type="hidden" name="attributeParameters.id" value="2" />
  <input type="text" name="attributeParameters.value" value="name" />
</form>

和 Controller :
params.list('attributeParameters').each {
   def ap = AttributeParameter.get(it.id)
   ap.value = it.value
   ap.save()
}

这有效。我唯一关心的是参数的输入顺序。如果它们始终以它们在表单上显示的顺序进入params对象,那么我应该没问题。但是,如果它们的输入方式有所不同,我可能会修改错误的AttributeParameter的值。

因此,仍在寻找更好的方法或某种形式的验证以确保它们的参数始终是先进先出。

更新2:

我遇到了this post,这是我想要的,但是我无法将Attribute.attributeParameters更改为List。他们需要待在一边。

最佳答案

你能做这样的事情:

<form>
  <input type="text" name="attributeParameter.1" value="1234567" />
  <input type="text" name="attributeParameter.2" value="name" />
</form>

从每个AttributeParameter动态创建名称和值的位置:
<g:textField name="attributeParameter.${attributeParameterInstance.id}" value="${attributeParameterInstance.value}" />

然后在您的 Controller 中
params.attributeParameter.each {id, val->
    def ap = AttributeParameter.get(id)
    ap.value = val
    ap.save()
}

这样,您可以直接获得每个参数的实际ID,而对它们的处理顺序无关紧要。

10-05 22:06