0

つまり、たとえば、抽象Petクラスと、その 3 つの具体的な実装があります。具象クラスと同様に、これらの人は共通のフィールドを共有し、独自のフィールドも持っています。たとえば、すべてが を持っていますが、鳥だけが を持っています。つまり、GSP が異なり、更新方法も異なります。CatDogBirdLegsWings

秘訣は、1 回のアクションで不確定数のインスタンスをインスタンス化し、検証し、永続化できる必要があるということです。簡単な実装は、基本的に次のとおりです。

create.gsp

Cat Hair Color: <g:textField name="catInstance.hairColor"/>
Dog Hair Color: <g:textField name="dogInstance.hairColor"/>
Bird Feather Color: <g:textField name="birdInstance.featherColor"/>

PetCommand.groovy

class PetCommand {

    Cat catInstance
    Dog dogInstance
    Bird birdInstance

}

PetController.groovy

def save(PetCommand cmd) {

    def catInstance = cmd.catInstance
    def dogInstance = cmd.dogInstance
    def birdInstance = cmd.birdInstance

    /* do stuff */

}

もちろん、実際のアプリケーションでは、これはかなり厄介になり、抽象クラスを使用する目的を完全に無効にします。

Pet複数のインスタンスを一挙にバインドし、それらをループして更新するパラメータを渡すなどの方法はありますか? わかりません、この全体が非常に混乱しています。

コマンド オブジェクトは厳密に必要というわけではありませんが、Grails コントローラーの厄介な冗長性の多くを修正します。

4

1 に答える 1

0

したがって、上記の Joshua Moore のコメントに基づいて、答えは次のようになります。

テンプレート(例: _bird.gsp)

    Bird Feather Color: <g:textField name="pets['bird'].featherColor"/>

GSP

    /* based on other logic, render appropriate templates */

コマンド オブジェクト

    List pets = [].withLazyDefault { petType -> return PetFactory.createPet(petType) }

ファクトリ(単純な実装)

    def createPet(String petType) {
        switch (petType) {
            case 'bird': return new Bird(); break;
        // ...etc...
    }

コントローラ

def update(PetCommand cmd) {
    cmd.pets?.each {
        petService.update(it, params)
    }
    /* ...etc... */
}

サービス

def update(Pet petInstance, Map params) {
    petInstance.update(params)
}

ドメイン

def update(Map params) {
    /* domain-specific business logic based on user input */
}

これはまだ実装されていません。うまくいかない場合は更新しようと思います。

于 2014-09-04T16:48:49.550 に答える