所以我有一个,比方说,Pet
抽象类,以及它的三个具体实现 - 让我们说Cat
,Dog
和Bird
。正如具体类所做的那样,这些人共享共同的字段,并且还有唯一的字段 - 例如,它们都有Legs
,但只有鸟有Wings
。因此,GSP不同,更新方法不同等等。
技巧是我需要能够在单个操作中实例化,验证和持久化不确定数量的实例。简单的实现基本上如下:
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控制器的许多烦人的冗余。
答案 0 :(得分: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 */
}
尚未实施;如果结果不起作用,我会尝试更新它。