我有以下域名:
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,所以它失败并出现错误:
不再引用cascade =“all-delete-orphan”的集合 拥有实体实例:com.foo.Attribute.attributeParameters
更新:
我将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>
控制器:
params.list('attributeParameters').each {
def ap = AttributeParameter.get(it.id)
ap.value = it.value
ap.save()
}
这很有效。我唯一关心的是参数的顺序。如果它们总是按照它们出现在表单上的相同顺序进入params对象,那么我应该没问题。但是如果它们有所不同,我可能会修改错误的AttributeParameter的值。
所以仍然在寻找一种更好的方式或某种形式的验证,他们的参数总是先进先出。
更新2:
我遇到了this post,这就是我想要的,但我无法将Attribute.attributeParameters更改为List。他们需要留下一套。
答案 0 :(得分:1)
你可以这样做:
<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}" />
然后在你的控制器中
params.attributeParameter.each {id, val->
def ap = AttributeParameter.get(id)
ap.value = val
ap.save()
}
这样你就可以直接获得每个参数的实际id,并且处理它们的顺序无关紧要。