Зачем поднимать триггеры методом? - PullRequest
2 голосов
/ 03 августа 2010

есть простая форма в Lift Framework и класс с методом render, который обрабатывает форму:

 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)
    <b>epsilon.snippet.PersonSnippet.register$1(Snippet.scala:33)</b>
    epsilon.snippet.PersonSnippet.render(Snippet.scala:41)

это похоже на то, что метод register запускается, даже если нет нажатия на submit, просто доступ к URL. Почему?
РЕДАКТИРОВАТЬ: это мое первоначальное лицо

@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 = _
}

Ответы [ 2 ]

3 голосов
/ 03 августа 2010

Я думаю, что 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 голос
/ 03 августа 2010

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

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

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