2011-06-12 8 views
3

3 개의 텍스트 영역으로 피드백 양식을 캡처하는 명령 객체가 있습니다.grails 도메인 객체의 필드 그룹 유효성 확인

class FeedbackCommand { 
    String textarea1 
    String textarea2 
    String textarea3 
    String username 

    static constraints = { 
     textarea1(nullable:true, blank:true)    
     textarea2(nullable:true, blank:true)    
     textarea3(nullable:true, blank:true)    
     username(nullable:false, blank:false) 
    } 
}  

적어도 하나의 텍스트 영역이 작성되었는지 확인하고 싶습니다.

가짜 플래그 필드를 '제약'필드로 추가 한 다음 해당 필드에 대한 사용자 지정 유효성 검사기에서 개체 검사를하고 있습니다. 내 자신을 둘러보고 내가 원하는 것을 찾지 못하면 오류가 발생합니다. 지금

, 나는이 일을 해요 :
class FeedbackCommand { 
    String textarea1 
    String textarea2 
    String textarea3 
    boolean atLeastOne = true 
    String username 

    static constraints = { 
     textarea1(nullable:true, blank:true)    
     textarea2(nullable:true, blank:true)    
     textarea3(nullable:true, blank:true) 
     atLeastOne(validator: { boolean b, FeedbackCommand form, Errors err -> 
      if (b) { 
      if ((form.textarea1==null || form.textarea1?.isAllWhitespace()) && 
       (form.textarea2==null || form.textarea2?.isAllWhitespace()) && 
       (form.textarea3==null || form.textarea3?.isAllWhitespace())) 
      { 
       // They havent provided ANY feedback. Throw an error 
       err.rejectValue("atLeastOne", "no.feedback") 
       return false 
      } 
      } 
      return true    
     })   
     username(nullable:false, blank:false) 
    } 
} 

  • 에 더 나은 방법이 분야의 관련/그룹 (적어도 하나는, 2를 비워 둘 수 없습니다를 확인 값 등을 가져야한다)?
  • 내 문단이 아닌 if-statement 블록이 아닌 "적어도 하나 이상의 null/공백이 없어야 함"을 표현하는 그루비 한 방법은 무엇입니까?

감사

답변

1

Extended Validation 플러그인은 또한 인공 플래그 필드를 정의하지 않고 또는 관련된 각 필드에 대한 검증을 반복하지 않고 여러 필드 위에 제약 조건을 정의 할 수 인스턴스 유효성 검사기에 대한 지원을 추가합니다.

+0

고맙습니다. 그 플러그인은 내가 웹 플로우와 cmdObjects를 사용하면서 씨름 해 왔던 것들을 많이 다루는 것처럼 보입니다. – Tak

+0

우리는 크고 긴 웹 플로우에서 명령 객체의 유효성을 검사 할 때 발생했던 몇 가지 문제를 해결하기위한 플러그인을 처음 개발했습니다. – Ruben

1

분야의 관련/그룹이 유효성 검사 (적어도 하나는 비워 둘 수 없습니다, 2 등, 값을 가져야한다)?

이 시도 : "적어도 하나의 야해 빈/null의 경우도"표현보다는 내 총 만약 문 블록에

if ((form.textarea1?.trim() ? 1 : 0) + 
    (form.textarea2?.trim() ? 1 : 0) + 
    (form.textarea3?.trim() ? 1 : 0) < 2) { 
    err.rejectValue("atLeastTwo", "no.feedback") 
    return false 
} 

groovier 방법을?

이 약간 Groovier입니다 ... 필드 그룹을 확인하는

if (!((form.textarea1?.trim() ?: 0) || 
    (form.textarea2?.trim() ?: 0) || 
    (form.textarea3?.trim() ?: 0))) { 
    err.rejectValue("atLeastOne", "no.feedback") 
    return false 
} 
+0

두 번째 블록이 바뀝니다. 표현 요소는 더하기 (+)가 아닌 OR (||)로 구분됩니다. –

0

WRT, 당신은 필드 중 하나에 검증 폐쇄를 할당 할 수 있습니다. 추가/가상 필드가 필요하지 않습니다. 가 자주 사용하는거야, 난 전문가가 아니에요, 예술적 소개 제약 http://grails.org/plugin/constraints

위한 플러그인을 플러그인 http://www.zorched.net/2008/01/25/build-a-custom-validator-in-grails-with-a-plugin/ 을 만들거나 사용합니다. 하지만 안전한 탐색기 운영자 ?.은 null을 요청할 필요가 없습니다.

if (form.textarea1?.isAllWhitespace() && 
    form.textarea2?.isAllWhitespace() && 
    form.textarea3?.isAllWhitespace()) 
    { 
      // They havent provided ANY feedback. Throw an error 
      err.rejectValue("atLeastOne", "no.feedback") 
      return false 
    } 
+0

감사합니다. NPE를 피하고 싶었 기 때문에 널 (null)을 검사하고 있었지만 null이 필드 자체를 원했기 때문에 null이 isAllWhitespace()에서 고려되지 않는 한 아마 ... – Tak

관련 문제