0

次のようなフォームがある場合

<input type="text" name="someCollection[0].someAssociation.id"/>
<input type="text" name="someCollection[1].someAssociation.id"/>
<input type="text" name="someCollection[2].someAssociation.id"/>

Grails は.idサフィックスに遭遇したときに自動データ バインディングを提供するため、Grails は次のように 3 つのクエリを意味するloadメソッドではなくgetメソッドを使用しているようです。

SELECT * FROM SomeAssociationClass WHERE id = ?
SELECT * FROM SomeAssociationClass WHERE id = ?
SELECT * FROM SomeAssociationClass WHERE id = ?

getId() 以外を使用しない限りデータベースにヒットしないため、loadメソッドが必要です (適用されません)。では、ロード メソッドを使用するようにデータ バインディングをカスタマイズするにはどうすればよいでしょうか。

4

2 に答える 2

0

データベースのインスタンスをロードしないようにするには、 .idサフィックスを削除し、loadメソッドの呼び出しを処理するカスタム propertyEditor を登録する必要があります。

class AppPropertyEditorRegistrar implements PropertyEditorRegistrar {

    void registerCustomEditors(PropertyEditorRegistry registry) {
        registry.registerCustomEditor(Question, new PropertyEditorSupport() {
        @Override
            void setAsText(String value) {
                setValue(Question.load(value as Long))
            }
        })
    }

}
于 2013-08-11T00:47:21.843 に答える
0

コマンド オブジェクトを使用して、フォームを送信するときにデータをバインドできます。

@Validateable
class ExampleCO {
String username
// here will be your field name which you use on view ,both name will same as in domain class.
static constraints = {
username nullable: false
    // here you can provide same constraints as you define in your domain classes. It will also check validation on field here.

  }
}

あなたはこのようにvaleを書くことができます。

 <g:form action="saveSkills" method="POST">`
<g:textField name="name" id="skillName" class="skillName" value="${exampleCO?.username}"
                                 placeholder="Add your skill" style="width: 280px"/>
</g:form>

フォームに入力してアクションを押して保存すると、フィールドの名前はコマンドオブジェクトの名前と同じになります。次に、実際には、次のように Command オブジェクトで受け取ることができます。

def actionName(ExampleCO exampleCO){
  DomainClass domainClass = new DomainClass()
  binddata(domainClass,exampleCO)
 domainClass.save()
 }

あなたの質問をよく理解できれば、それが役立つことを願っています。

于 2013-08-10T18:14:40.700 に答える