3

実行するCRUD操作がいくつかあり、それぞれがモデルのコレクション(ゲームのスケジュール、チーム名簿、ゲームの結果、ゲームの統計など)に基づいています。

Playエクスペリエンスのこの時点まで(わずか数か月、1つのプロジェクトがライブ)、モデルインスタンスへの1対1のフォームバインディングを使用してきました。

フォームのフィールド名に数値でインデックスを付けることができることは知っていますが、投稿されたフォームをList [Model]にバインドするにはどうすればよいですか?

これは私の1対1のバインディングがどのように見えるかです:

// abstract away bindFromRequest to make binding more concise in controllers
def bindForm[T](f: play.api.data.Form[T])(implicit r: play.api.mvc.Request[_]) =
  f.bindFromRequest fold(e=> Left(e.errorsAsJson), Right(_))

そしてコントローラーで:

val result = for {
  model <- bindForm(form).right
  id    <- dao.create(model) as json
} yield id

私がやりたいことは同じですが、成功時に単一のモデルを返すモデルバインディングの代わりに、List [Model]を返し、オーバーロードされたDAOの作成/編集/削除操作に渡します。

フォームマッピングの一部として使用できるメソッドがあるようですlistが、JDBCクエリラッパー(ScalaQuery / Slick)で大混乱を引き起こし、ケースクラス/コンパニオンオブジェクトマッピングが機能しない可能性が高いと感じています。コレクションのプロパティとよく合います。

たとえば、ゲームスケジュールの既存のマッピングは次のようになります。

object CompositeForm {
  import play.api.data.{Form, Forms}, Forms._
  import utils.Validator.Bindings.jodaLocalTimeFormat
  val mapper = mapping(
    'id   -> ignored(0),
    'gameDate -> jodaDate,
    'gameType -> optional(text),
    'location -> optional(text),
    'team1    -> number,
    'team2    -> number
  )(Composite.apply)(Composite.unapply)
  val form = Form( mapper )
}

代わりに使用list(gameDate), list(gameType)するということは、フォームバインディングが、プロパティがすべてコレクションである単一のコンポジットインスタンスを返すことを意味します。おそらくそれは機能しますが、モデルインスタンスのコレクションを操作するほどクリーンで単純ではないようです。

アイデアを高く評価しました;-)

4

1 に答える 1

1

Playフォームマッピングのまだ文書化されているseq()オプションは、@JulienRichard-FoyによってPlaygoogleグループで私に指摘されました

repeat()andを一緒に使用するとseq()、フォームマッピングを繰り返すことができるため、インデックス付きのfoo.bar[n]フォームフィールド要素のコレクションが作成されます。

object ScheduleForm {
  import play.api.data.{Form, Forms}, Forms._
  val mapper = mapping(
    'composite -> seq(CompositeForm.mapper), 
    'note -> seq(ScheduleNoteForm.mapper)
  )(Schedule.apply)(Schedule.unapply)
  val form = Form( mapper )
}

そして、ビューで:

@repeat(_form("composite"), min=@numGames) { f=>
    @inputDate(f("gameDate"), '_label-> "Game Date", 'class-> "required")
...
}
于 2012-10-04T19:44:44.817 に答える