質問は - この種の入力からデータを取得し、それを適切に DB に (SORM フレームワークによって) 渡すにはどうすればよいですか?
DB の 2 つのテーブルにデータを渡そうとしましたが、結果として、最初のテーブル (Author) に値が適切に挿入され、2 番目のテーブル (Book) はそのまま残ります。おそらく私の問題は、ページでネストされた繰り返し入力に適切に名前を付けていないことですが、これを行う適切な方法が見つかりません(私はScalaにかなり慣れていないため、おそらくこれに関する経験が不足しています)。
Ok(Json.toJson(author))
Application.scala の addData に表示されます
{"name":"what","books":[]}
だから私は、問題はリクエストからデータをバインドすることにあると思います。
ここで例に従ってみました: Sorm で多くの子を持つエンティティをモデル化する方法は? そしてここ:https://www.playframework.com/documentation/2.1.1/ScalaForms、Playフレームワークのテンプレート「play-scala」を操作することにより、次のようなコードを取得しました:
モデルは次のとおりです。
case class Author(name: String, books: Seq[Book]) {
}
object Author {
implicit val authorFormat = Json.format[Author]
}
case class Book(title: String ) {
}
object Book {
implicit val bookFormat = Json.format[Book]
}
case class AuthorBook(name: Author, title: Book) {
}
scala.index.html
<table>
<tr>
<td>
On the left Author, on the right Book
<td>
</tr>
<tr>
<td>
<ul id="authors"></ul>
</td>
<td>
<ul id="books"></ul>
</td>
</tr>
</table>
<table>
<form action="@routes.Application.addData()" method ="post">
<tr>
<td>Author: <input name="author" type="text">
</td>
<td>Books: <input name="books.title[0]" type="text"><br><input name="books.title[1]" type="text">
</td>
</tr>
<tr>
<td>
<button>Submit</button>
</td>
</tr>
</form>
</table>
そして Application.scala
class Application extends Controller {
def index = Action {
Ok(views.html.index("E-Library"))
}
val authorForm: Form[Author] = Form {
mapping(
"author" -> text,
"books" -> seq(
mapping(
"title" -> text)(Book.apply)(Book.unapply)
)
)(Author.apply)(Author.unapply)
}
def error = Action {
Ok("error")
}
def addData = Action { implicit request =>
authorForm.bindFromRequest.fold(
formWithErrors => {
BadRequest("Bad request!")
},
authorF => {
val author = DB.save(authorF)
Ok(Json.toJson(author))
//Redirect(routes.Application.index())
}
)
}
def getAuthor = Action {
val dataAuthor = DB.query[Author].fetch
Ok(Json.toJson(dataAuthor))
}
def getBook = Action {
val dataBook = DB.query[Book].fetch
Ok(Json.toJson(dataBook))
}
def getData = Action {
Redirect(routes.Application.index())
}
}