0

私は次のドメインを持っています:

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

class AttributeParameter {

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

属性の既存のすべてのAttributeParametersを表示し、ユーザーがそれらの値を入力して[保存]をクリックできるようにするフォームがあります。保存時に、各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:

私はこの投稿に出くわしました、そしてそれは私が望むものです、しかし私はAttribute.attributeParametersをリストに変えることができません。彼らはセットとしてとどまる必要があります。

4

1 に答える 1

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を直接取得でき、それらがどの順序で処理されたかは関係ありません。

于 2012-12-15T20:27:59.353 に答える