gpt4 book ai didi

Grails rejectValue - 多次检查导致 ob.errors null

转载 作者:行者123 更新时间:2023-12-02 15:04:36 25 4
gpt4 key购买 nike

我的域对象预订具有多个允许为空的属性,因为它们将在对象保存到数据库后稍后设置。

myService.action() 的一部分:

booking.properties = params    

if (booking.contactFirstname?.length() <= 1) { booking.errors.rejectValue("contactFirstname", "empty") }
if (booking.contactLastname?.length() <= 1) { booking.errors.rejectValue("contactLastname", "empty") }
if (booking.contactPhone?.length() <= 1) { booking.errors.rejectValue("contactPhone", "empty") }
if (booking.contactMobile?.length() <= 1) { booking.errors.rejectValue("contactMobile", "empty") }
if (booking.contactEmail?.length() <= 1) { booking.errors.rejectValue("contactEmail", "empty") }

if (booking.hasErrors() || ! booking.validate()) {
return [success: false, model: booking]
} else {
booking.save(failOnError: true)
return [success: true, model: booking]
}

我的 Controller 会:
def result = myService.action(params)
if (result.success) {
flash.success = message(code: "msg.successfullySaved")
redirect(action: "registerEventConfirmation", id: result.model.uid, params: [lang: params.lang], mapping: "paginated")
} else {
flash.error = message(code: "msg.errorSavingCheckFields")
render(view: "registerEventStep3", params: [lang: params.lang], model: [booking: result.model])

我正在使用
hasErrors(bean: booking,field:'contactFirstname', 'has-error')}

标记错误字段。

如果我现在在文本字段中提交没有任何值的表单,所有字段都是红色的,booking.errors 有 >0 错误。

如果我在使用名字之后提交表单,则 booking.errors 为 NULL 并且没有标记其他字段。

这是一个错误吗?我使用 Grails 2.3.6

附加信息
  • 我访问表单,完全空提交
  • 我看到所有表单字段都是红色的,object.errors 有 >0 个错误(有效)
  • 我在第一个字段中输入一个值,名字并提交
  • 我没有看到任何红色的表单字段,object.errors =0 错误(无效)
  • 我重新提交表格,没有任何变化
  • 我看到所有空的表单字段都是红色的,object.errors 有 >0 个错误(有效)
  • 最佳答案

    既然我完全理解了这种情况,而且由于我休眠困难,我想我给你一个非常简洁的答案,这样你就可以充分理解并正确使用东西。

    首先,我知道创建一个验证 bean 听起来需要做很多工作,所以让我教你如何相对简单地完成这一切,以及为什么它是我的首选方法。

    这是我的首选方法,因为当你这样做时

    类 MyController {

     def myAction(Mybean bean) {
    // 1. the object allowed into this save action
    // are all that is available objects withing MyBean.
    // If it has user define but not telephone. Then
    // if telephone is passed to myAction it will fail and not recognise
    // field
    // When declaring Date someField or User user then the params now
    // received as bean this way is now actually properly bound
    // to the data / domainType declared.
    // Meaning user will now be actual user or someField actually Date
    }

    所以现在来解释如何最好地解决这个问题。创建 bean 时,只需将域文件夹中的实际域类复制到 src/groovy/same/package在 grails 2 或 src/main/groovy/same/package 中在 chalice 3

    更改名称/类别或从 Booking 复制至 BookingBean所以它有一个不同的名字。

    添加 @Validateable高于实际 BookingBean在 grails 2 中或将工具添加到主类,如 Class BookingBean implements Validateable {在 chalice 3

    现在,由于它被复制,所有对象都是相同的,此时来自 Controller 的保存将是
    class MyController {

    def myAction(BookingBean bean) {
    Booking booking = new Booking()
    // this will save all properties
    booking.properties = bean
    booking.save()
    }
    }

    但是你有一个特殊的情况,你想在主域类中声明一个 transient 字段,我会做的是
    class BookingBean {
    def id
    String contactFirstname
    String contactLastname
    boolean secondSave=false

    static constraints = {
    id(nullable: true, bindable: true)
    contactFirstname(nullable:true) //,validator:checkHasValue)
    contactLastname(nullable:true) //,validator:checkHasValue)
    secondSave(nullable:true,validator:checkHasValue))

    }

    //use the same validator since it is doing identical check

    static checkHasValue={value,obj,errors->
    // So if secondSave has a value but contactFirstName
    // is null then complain about contactFirstName
    // you can see how secondSave gets initialise below
    //typical set this to true when you are about to save on 2nd attempt
    //then when set run validate() which will hit this block below

    // Check all the things you think should have a
    // value and reject each field that don't
    if (val) {
    if ( !obj.contactFirstname) {
    errors.rejectValue('contactFirstname',"invalid.contactFirstname")
    }
    if ( !obj.contactSecondname) {
    errors.rejectValue('contactSecondname',"invalid.contactSecondname")
    }
    //and so on
    }
    }

    所以现在在你的 Controller 中:
    class MyController {

    def save1(BookingBean bean) {
    Booking booking = new Booking()
    // this will save all properties
    booking.whatEver = bean.whatEver
    booking.save()


    // you can choose to validate or not here
    // since at this point the secondSave has
    // not been set therefore validation not called as yet in the bean

    }

    //你可能有 id 并且它应该与实际的域类绑定(bind)
    def save2(BookingBean bean) {

    booking.secondSave=true
    if (!bean.validate()) {
    //this is your errors
    //bean.errors.allErrors
    return
    }
    //otherwise out of that loop since it hasn't returned
    //manually set each object
    booking.contactFirstname=bean.contactFirstName
    booking.contactSecondname=bean.contactSecondname
    booking.save()


    }

    }

    e2a 旁注 - 上面应该回答

    在你创建它之前不要验证它。仅在创建对象然后添加值后对其进行验证。替代方法可能在您作为第二次检查的一部分运行的验证 bean 中创建一个函数。 This Example bean未经验证 until formatRequest被称为 as seen here

    关于Grails rejectValue - 多次检查导致 ob.errors null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39610111/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com