如果我有这样的域类:
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
和undefined
之间的差异。
所以我的问题是:命令对象是否有任何方法可以使用可选的可空字段?如果是这样,我将如何做到满足上述情况呢?
答案 0 :(得分:0)
您可以将域类实例的属性与命令对象的属性相关联,而不是手动检查
person.properties = cmd.properties
我与您共享控制器操作,以验证与您有关的案件
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中的更深层示例,您会发现类似的案例
答案 1 :(得分:0)
保持request.JSON
可用,以便我们可以在其上运行containsKey()
来测试请求是否传递了值。注意:将命令对象放在方法参数中将消耗request.JSON
,它将为空。
class PersonUpdate implements grails.validation.Validateable {
String phoneNumber
Book favoriteBook
static constraints = {
phoneNumber nullable: true
favoriteBook nullable: true
}
}
def updatePerson() {
PersonUpdate cmd = new PersonUpdate(request.JSON)
Person person = ...
if (request.JSON.containsKey("phoneNumber")) person.phoneNumber = cmd.phoneNumber
if (request.JSON.containsKey("favoriteBook")) person.favoriteBook = cmd.favoriteBook
person.save()
}