2010-08-03 2 views
2

는 리프트 프레임 워크에서 간단한 양식 및 양식을 처리하는 렌더링 방법 클래스있다 : 트리거 방법을 들어야하는 이유는 무엇입니까?

def render(xhtml:NodeSeq) = { 
     var name = "" 
     var role = "" 
     var human = "" 
     def register = { 
      val person = new Person 
      person.name = name 
      person.role = role 
      person.human = if (human == "yes") "true" else "false" 
      model.create(person) 
      S.redirectTo("/index") 
     } 
     bind("user", 
     xhtml, 
     ("name" -> SHtml.text(name, name = _)), 
     ("role" -> SHtml.text(role, role = _)), 
     ("human" -> SHtml.text(human,human = _)), 
     ("submit" -> SHtml.submit("Register",register))) 
    } 

내가 예를 들어,이 예제를 실행

. 내가 오류 다음 얻을 따라 형태 바인더 제본 된 URL에 액세스 : 등록 방법은 실행되었는지도 제출에 더 클릭 그냥 URL에 액세스, 거기에없는 것처럼

Message: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number 
... 
... 
... 
    epsilon.sjbs.CrudModel$class.create(Sjbs.scala:14) 
    epsilon.sjbs.PersonModel.create(Sjbs.scala:7) 
    epsilon.snippet.PersonSnippet.register$1(Snippet.scala:33) 
    epsilon.snippet.PersonSnippet.render(Snippet.scala:41) 

이 보인다. 왜?
편집 : pr1001이 person.human 부울 될 가능성이 썼던 것처럼이 내 원래 개체

@NamedQuery(name = "findAll", query = "select x from Person x") 
@Entity class Person extends Id with Name{ 
    @OneToMany(mappedBy="person", cascade=Array(CascadeType.REMOVE)) 
    var participated:java.util.List[Participant] = new java.util.ArrayListParticipant 
    var role:String = Role.User 
    var human:String = _ 
} 

답변

3

내가 Person.humanBoolean 아닌 String이라고 생각 ... 당신이 매퍼처럼 보이는 뭔가를 사용하고있는 것 같습니다

: 당신은 지정을 변경하기 만. 물론

def render(xhtml:NodeSeq) = { 
    val person = Person.create 
    bind(
    "user", 
    xhtml, 
    "name" -> SHtml.text(person.name, person.name(_)), 
    "role" -> SHtml.text(person.role, person.role(_)), 
    "human" -> SHtml.text(
     if (person.human) ? "yes" else "no", 
     (human) => person.human(if (human == "yes") true else false) 
    ), 
    "submit" -> SHtml.submit("Register",() => { 
     person.save 
     S.redirectTo("/index") 
    }) 
) 
} 

그냥 개인적인 취향을하지만, 그런 식으로 당신은 명시 적 vars를 사용하지 않을 쉽게 기존 Person을 편집을 다시 사용할 수 있습니다 .. : 당신이 매퍼를 사용한다면, 정말처럼 할 거라고

1

입니다.

register가 호출되지 않았지만 person.human은 이미 human 문자열이 register 메소드에서 설정되었으므로 이미 평가되었습니다.

person.human = if (human == "yes") true else false 
+0

하지만 심각하게 CastException 문제를 해결했으며 이제 페이지에 대한 액세스가 즉각적으로 "/ index"로 리디렉션됩니다. – coubeatczech

관련 문제