Играть! Форма, которая выбирает элемент из отдельной коллекции mongo

Итак, для системы, которую я разрабатываю, я пытаюсь сделать что-то подобное:

Если у меня есть модель под названием User, у которой есть _id (ObjectId), имя пользователя, пароль, а затем я пытаюсь создать новую встречу, моя форма будет искать пациента (отображать имя пациента в раскрывающемся списке, но действительно выбрать вверх ObjectId пациента) и время приема.

Теперь я искал везде и не могу найти ничего отдаленно близкого к решению, которого я пытаюсь достичь.

В Application.scala у меня есть:

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

Я не знаю, как правильно проработать свою точку зрения, чтобы отразить пациента. Я знаю, что вам нужно сделать что-то вроде этого:

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

Может ли кто-нибудь дать мне какие-либо идеи относительно того, как я могу найти пациентов для этого примера, чтобы получить Mongo ObjectId.

ORM, который я использую btw, - https://github.com/leon/play-salat.


person George Vasels    schedule 09.08.2012    source источник
comment
Вы можете попробовать опубликовать проблему в очереди проблем github .. похоже, автор довольно активно отвечает.   -  person Stennie    schedule 12.08.2012


Ответы (2)


вот пример, как я бы это сделал:

маршруты:

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))
      })
  }
}
person maxmc    schedule 11.09.2012

Fyi, я наконец смог решить проблему, увидев этот замечательный комментарий maxmc. Оказывается, моя проблема была действительно фундаментальной проблемой Scala. Я не понимал, что 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]. Мы этого не хотим. Нам нужно получить список, по которому мы можем перемещаться внутри представления. Вот почему вы все-таки находитеAll.toList. Оттуда @select отобразит pList, и для каждой записи из базы данных идентификатор будет связан с именем пациента. Обратите внимание, что это строка, потому что Seq для тега @Select требует Seq (String, String)

person George Vasels    schedule 05.11.2012