1

次のような複合ドメイン オブジェクトがあります。

class Person 
{
    static embedded = ['forSale']
    Boolean isSelling
    House forSale
}

class House 
{
    Integer numBedrooms
}

次のように、numBedrooms の選択コントロールがあります。

<tr class="prop">
 <td valign="top" class="name">
   <label for="numBedrooms"><g:message code="person.numBedrooms.label" default="Num Bedrooms" /></label>
 </td>
 <td valign="top" class="value ${hasErrors(bean: personInstance, field: 'forSale.numBedrooms', 'errors')}">
     <g:select name="numBedrooms" value="${fieldValue(bean: personInstance, field: 'forSale.numBedrooms')}" 
          noSelection="${['null':'Select a number...']}"
      from="${1..6}"
     />
 </td>
</tr>

select の fieldValue で forSale.numBedrooms を使用していることに注意してください。create-views によって生成される create ビューには forSale House オブジェクトのフィールドへの参照が含まれていないため、これがどのように行われるかを確認するための足場コードを作成できませんでした。

また、GSP 経由で複合フィールドにアクセスする例を見つけることもできなかったので、これは推測にすぎません。いずれにせよ、GSP ページはエラーなしで表示されますが、これはデータを保存できなかったことが原因かもしれません。

numBedrooms の値を URl クエリ文字列の一部として送り返します...

&numベッドルーム=2

これを行うと、コントローラーの保存コードがサイレントに失敗します-少なくともデータベースには何も書き込まれません。ほとんどすべてのデバッグ ロギングを有効にしましたが、ログに何か問題があることを示唆するメッセージが表示されません。

クエリ文字列から numBedrooms パラメーターを削除すると、保存は通常どおり進行するので、numBedrooms の解決に関係があると推測しています。

私が間違っていることと、問題を追跡するために何ができるかについての手がかりはありますか?

4

1 に答える 1

0

私がすることはgenerate-allHouseドメインに対して、GSP コードをコピーして貼り付け、完了したらファイルを削除することです。Houseまた、後でドメインを使用する場合に備えて、テンプレートを作成してドメインを編集する方が賢明であることもわかりましHouseた。

あなたのGSPには、このようなものが必要です( name 属性に注意してください)

<tr class="prop">
 <td valign="top" class="name">
   <label for="forSale.numBedrooms"><g:message code="house.numBedrooms.label" default="Num Bedrooms" /></label>
 </td>
 <td valign="top" class="value ${hasErrors(bean: personInstance.forSale, field: 'numBedrooms', 'errors')}">
     <g:select name="forSale.numBedrooms" value="${fieldValue(bean: personInstance.forSale, field: 'numBedrooms')}" 
          noSelection="${['null':'Select a number...']}"
      from="${1..6}"
     />
 </td>
</tr>

あなたのparam文字列には、必要があり*forSale*.numBedrooms=2ます。このコードは または で動作しperson.properties = paramsますnew Person(params)

埋め込まれた「命令」は、Hibernate にパラメーターを同じテーブルに含めるように指示するだけで、それらは依然として別個のドメイン クラスです。使用しない場合でも、ドメインのテーブルが生成される可能性があります。

お役に立てれば。

于 2010-01-24T23:26:44.493 に答える