3

したがって、私が開発しているシステムの場合、私はこれに似た何かをしようとしています。

_id(ObjectId)、username、passwordを持つUserというモデルがあり、新しい予定を作成しようとすると、フォームは患者を検索します(ドロップダウンに患者名を表示しますが、実際には患者のObjectId)、および予約時間をアップします。

今、私はいたるところを見て、私が達成しようとしている解決策にリモートで近いものを見つけることができません。

Application.scalaには、次のものがあります。

val appointmentForm= Form(
  tuple(
    "patient" -> nonEmptyText, // ObjectId
    "startTime" -> nonEmptyText))

患者を反映するために自分の見解をどのようにうまく機能させるかがわかりません。私はあなたがこのようなことをしなければならないことを知っています:

@select(appointmentForm("patient"), options(..)

この例でMongoObjectIdを取得するために患者を検索する方法について、誰かが私にアイデアを教えてもらえますか。

私が使用しているORMはhttps://github.com/leon/play-salatです。

4

2 に答える 2

1

これが私がそれを行う方法の例です:

ルート:

GET      /test        controllers.Test.show
POST     /test        controllers.Test.submit

見る:

@(f: Form[(ObjectId, String)], users: Seq[(ObjectId, String)])
@import helper._

@form(action = routes.Test.submit) {
  @select(f("patient"), options = users.map(user => (user._1.toString, user._2)))
  @inputText(f("startTime"))
  <input type="submit" value="Submit!">
}

コントローラ:

package controllers

import org.bson.types.ObjectId
import play.api.data.format.Formatter
import play.api.mvc._
import play.api.data.Forms._
import play.api.data._
import play.api.data.FormError
import play.api.Logger

object Test extends Controller {

  /**
   * Converts an ObjectId to a String and vice versa
   */
  implicit object ObjectIdFormatter extends Formatter[ObjectId] {
    def bind(key: String, data: Map[String, String]) = {
      val error = FormError(key, "error.required.ObjectId", Nil)
      val s = Seq(error)
      val k = data.get(key)
      k.toRight(s).right.flatMap {
        case str: String if (str.length() > 0) => Right(new ObjectId(str))
        case _ => Left(s)
      }
    }
    def unbind(key: String, value: ObjectId) = Map(key -> value.toStringMongod())

    val objectId: Mapping[ObjectId] = of[ObjectId]
  }

  // import to get objectId into scope
  import ObjectIdFormatter._

  // define user tuples consisting of username and ObjectId for the dropdown. In real lif the list is probably fetched from the db
  def users: Seq[(ObjectId, String)] =
    Seq((new ObjectId("4f456bf744aed129d04db1bd"), "dieter"), (new ObjectId("4faa410b44aec5a0a980599f"), "eva"))

  val appointmentForm= Form(
    tuple(
      "patient" -> objectId, // use the ObjectIdFormatter
      "startTime" -> nonEmptyText))


  def show = Action {
    Ok(views.html.test(appointmentForm, users))
  }

  def submit = Action { implicit request =>
    appointmentForm.bindFromRequest.fold(
      formWithErrors => {
        Logger.warn("errors: " + formWithErrors.errors)
        BadRequest(views.html.test(formWithErrors, users))
      },
      formContent => {
        Logger.info("formContent: " + formContent)
        Ok(views.html.test(appointmentForm, users))
      })
  }
}
于 2012-09-11T14:30:41.323 に答える
0

参考までに、maxmc によるこの素晴らしいコメントを見て、ようやく問題を解決できました。私の問題は本当に基本的なスカラの問題であることがわかりました。List が Seq の実装であることを知りませんでした。したがって、この例で Mongo を使用すると、コード内で次のことを行う必要があります。

コントローラ

 def newAppointment= Action {
   val pList  = Patient.findAll.toList
   Ok(views.html.admin.newuser(appointmentForm, pList))
 }

意見:

@(appointmentForm: Form[(String, String, String)], pList : List[Patient])

... ... ...

@select(
        appointmentForm("patient"),
        pList.map{ p =>
            p.id.toString -> (p.patientName)
        },
        '_default -> "--- Select a Patient ---",
        '_label -> "Patient"
    )

Model.findAll 関数は Iterator[Type] を返します。私たちはそれを望んでいません。ビュー内を走査できるリストを取得する必要があります。そのため、 findAll.toList を実行します。そこから、@select は pList をマップし、データベースからの各エントリに対して ID を患者名に関連付けます。@Select タグの Seq には Seq(String, String) が必要なため、文字列であることに注意してください。

于 2012-11-05T19:09:03.027 に答える