2

Lift フレームワークには単純なフォームがあり、フォームを処理する 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)
    epsilon.snippet.PersonSnippet.register$1(Snippet.scala:33)
    epsilon.snippet.PersonSnippet.render(Snippet.scala:41)

これは、submit をクリックしなくても、url にアクセスするだけで register メソッドが実行されているように見えます。なんで?
編集:これは私の元の実体です

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

4

2 に答える 2

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ます...

于 2010-08-03T13:00:43.880 に答える
1

pr1001 が書いたように、 person.human はブール値である可能性があります。

register は呼び出されませんが、register メソッドの外に human 文字列が設定されているため、 person.human は既に評価されています。割り当てを変更するだけです。

person.human = if (human == "yes") true else false
于 2010-08-03T12:17:36.363 に答える