2009-06-22 4 views
1

이 유효성 검사 문제를 파악하는 데 어려움이 있습니다.유효성 검사 오류가보기에 렌더링되지 않았습니다.

class Person { 
    String fullName 
    List telephones = [] 

    static hasMany = [telephones : Telephone] 

    static constraints = { 
     fullName(size:3..50, blank:false, nullable:false) 
    } 
} 

그런 다음 sublcass : 다음 SalesAdvisorController에서

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) 
    } 
} 

내가 저장 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> 

유효성 검사가 정상적으로 작동하는 것으로 보입니다. 그러나 내가 comission 필드의 float 대신에 문자열을 제출하면, 로그에서 "typeMismatch"를 볼 수 있지만 아무것도 렌더링하지 않습니다! message.properties 파일에는 typeMismatch에 대한 기본 항목이 있습니다. fullName 필드에서도 로그에서 "null 허용"및 "빈"오류를 볼 수 있지만 뷰는 아무 것도 렌더링하지 않습니다.

유닛 테스트가해야하는 것처럼 동작하므로 컨트롤러 또는 도메인보다 뷰의 결함이 더 많은 것 같습니다.

답변

2

나는 문제가 모델-통과 코드에서 간단한 오타이다라고 말하고 싶지만 :

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

(대문자 SalesAdvisor 값을 참고). 당신은 여기에 큰 따옴표를 사용해야합니다

name:'${params.fullName}Inventory' 

(G 스트링) : 보조 노트로

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

을 시도하여 인벤토리 구축 코드에 버그가있다.

+0

나는 집에 없기 때문에 시도 할 수는 없지만 모델지도를 통해 모델을 뷰에 전달할 때 키가 뷰에 값을 액세스하는 방법과 값 도메인 클래스입니까? 하지만 이제는 값이 인스턴스 자체 여야합니다. – Cesar

+0

글쎄, 나는 "모델"이라는 용어가 약간 오버로딩되어 모호한 것 같아. 대개 모델 (MVC의 "M")으로 도메인 모델 (데이터베이스와 ORM 프레임 워크에 의해 백업 됨)을 참조하십시오. 컨트롤러 액션에서 뷰로 전달하는 맵은 실제로는 다른 것입니다. 도메인 모델 클래스의 인스턴스가 포함되어있는 경우가 많지만이 클래스에만 국한되지는 않습니다. 보기에 사용하고 싶거나 필요로하는 값을 전달할 수 있습니다. 귀하의 경우, renderErrors 태그는 salesAdvisor (bean = "$ {salesAdvisor}")가 도메인 클래스 (오류가있을 수있는 인스턴스)의 인스턴스라고 기대합니다. –

관련 문제