2010-08-03 2 views
2

есть простая форма, в рамках Lift и класс с рендерингом методом, который обрабатывает форму:Зачем нужен метод триггеров?

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, который переплетен в соответствии форму, я получаю следующее сообщение об ошибке:

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) 

это похоже, что метод регистра побежал даже нет нажмите на отправить, просто получить доступ к ссылке. Зачем?
EDIT: это мое первоначальное лицо

@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.human является Boolean, не String ...

Похоже, вы используете что-то, что выглядит как Mapper. Если вы использовали Mapper, я бы сделал это так:

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

Как pr1001 писал person.human, вероятно, будет логическим значением.

регистр не вызывается, но person.human уже оценивается, потому что человеческая строка задана из регистра. Вам нужно только изменить назначение:

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

но серьезно, я исправил проблему с CastException, и теперь доступ к этой странице делает немедленное перенаправление на «/ index», – coubeatczech

Смежные вопросы