Картографирането на OneToMany в рамката на Scala Play не вмъква данни във втората таблица

Въпросът е - как трябва да взема данни от този вид входове и да ги предам правилно на DB (чрез SORM framework)?

Опитвам се да предам данни на две таблици в моята БД, резултатът от работата ми е, че докато стойностите са правилно вмъкнати в първата таблица (Автор), втората (Книга) остава недокосната. Вероятно проблемът ми е, че не наименувам правилно вложени, повтарящи се входове на моята страница, но не мога да намеря правилния начин да направя това (сравнително нов съм в Scala, така че вероятно нямам опит в това).

Ok(Json.toJson(author)) 

в addData в Application.scala ми показва

{"name":"what","books":[]}

така че мисля, че проблемът е в обвързването на данни от заявка.

Опитах се да следвам примери тук: Как да моделирам обект с много деца в Sorm? и тук: https://www.playframework.com/documentation/2.1.1/ScalaForms, работейки върху шаблона "play-scala" от Play framework, така че имам код като този:

Моделите са:

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())
  }
}

person Maelren    schedule 11.09.2015    source източник


Отговори (1)


Намерих го! Както е споменато тук: Вложена форма в Play! Scala 2.2

Трябваше да преименувам входните имена в моя формуляр от book.title[0] на book[0].title.

person Maelren    schedule 11.09.2015