代码之家  ›  专栏  ›  技术社区  ›  Cesar

视图中未呈现验证错误

  •  1
  • Cesar  · 技术社区  · 15 年前

    class Person {
        String fullName
        List telephones = []
    
        static hasMany = [telephones : Telephone]
    
        static constraints = {
            fullName(size:3..50, blank:false, nullable:false)
        }
    }
    

    然后是一个子类:

    class SalesAdvisor extends Person{
        Float comission //In percentage
        Portfolio customerPortfolio
        Inventory inventory
    
        static constraints = {
            comission(range:0..100, scale:2, nullable:false)
            customerPortfolio(nullable:false) 
            inventory(nullable:false)
        }
    }
    

    在SalesAdvisorController中,我保存SalesAdvisor实例:

    def save = {
        def portfolio = new Portfolio()
        def inventory = new Inventory(name:'${params.fullName}Inventory', description:"${params.fullName}'s Inventory")
        params.customerPortfolio = portfolio
        params.inventory = inventory
        def salesAdvisor = new SalesAdvisor(params)
    
        if(!salesAdvisor.hasErrors() && salesAdvisor.save()){
            log.info("New instance of SalesAdvisor saved.")
            redirect(action:show, id:salesAdvisor.id)
        }else{
            log.error("There was an error saving the sales advisor.")
            salesAdvisor.errors.allErrors.each{
            println it.code
        }
        render(view:'create', model:[salesAdvisor:SalesAdvisor])
      }
    }
    

    为了显示任何错误,在“创建”视图中,我有:

    <g:hasErrors bean="${salesAdvisor}">
        <div class="errors">
            <g:renderErrors bean="${salesAdvisor}" as="list" />
        </div>
    </g:hasErrors>
    

    验证似乎工作正常。但是,如果我为佣金字段提交一个字符串而不是一个浮点数,在日志中我可以看到“typeMismatch”,但是视图没有呈现任何内容!message.properties文件具有类型不匹配的默认条目。对于fullName字段也是一样,在日志中我可以看到“null”和“blank”错误,但是视图没有呈现任何内容。

    我猜这更多的是视图的错,而不是控制器或域的错,因为单元测试的行为应该是这样的。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Daniel Rinser    15 年前

    我认为问题在于模型传递代码中的一个简单输入错误:

    render(view:'create', model:[salesAdvisor:SalesAdvisor])
    

    render(view:'create', model:[salesAdvisor:salesAdvisor])
    

    name:'${params.fullName}Inventory'
    

    这里应该使用双引号(GString)。