如果我有这样的域类:
class Person {
String phoneNumber
Book favoriteBook
static constraints = {
phoneNumber nullable: false // you must have a phone number
favoriteBook nullable: true // it is not necessary to have a favorite book
}
}
在这种情况下,一个人不需要拥有自己喜欢的书。
我想创建一个命令对象,该命令对象将允许用户更新其信息。
class PersonUpdate {
String phoneNumber
Book favoriteBook
static constraints = {
phoneNumber nullable: false
favoriteBook nullable: true
}
}
def updatePerson(PersonUpdate cmd) {
Person person = ...
person.phoneNumber = cmd.phoneNumber
person.favoriteBook = cmd.favoriteBook
person.save()
}
但这将要求他们每次想要进行更新时都重新指定所有信息。因此,我要做的是使所有内容变为可选:
class PersonUpdate {
String phoneNumber
Book favoriteBook
static constraints = {
phoneNumber nullable: true
favoriteBook nullable: true
}
}
def updatePerson(PersonUpdate cmd) {
Person person = ...
if (cmd.phoneNumber != null) person.phoneNumber = cmd.phoneNumber
if (cmd.favoriteBook != null) person.favoriteBook = cmd.favoriteBook
person.save()
}
现在,如果该人决定不再希望拥有自己喜欢的书,该怎么办。他们将执行的操作是发送JSON有效负载,如下所示:
{favoriteBook:null}
但这不会做任何事情,因为在更新favoriteBook
之前将其检查为非null。这通常归结为
null
和undefined
之间的差异。所以我的问题是:命令对象是否有办法具有可选的可空字段?如果是这样,我将如何满足上述情况?
最佳答案
您可以将域类实例的属性与命令对象的属性相关联,而不必手动检查
person.properties = cmd.properties
我与您共享 Controller 操作,以验证与您有关的类似案例
def update(UpdatePersonCommand command) {
Person person = Person.get(params.id)
if (command.hasErrors()) {
respond ([errors: command.errors], model: [person: person], view: 'edit')
return
}
person.properties = command.properties
person.save(flush: true)
redirect action: 'edit', id: params.id
}
您可以在4.3节中的grails guide中验证更深入的示例,实现编辑和更新操作,您会发现类似的情况
关于grails - Grails命令对象中的可选可空字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47047236/