我在Scala和Play上苦苦挣扎。我的模型中有这本书课
class Book(identifier: Int, title1: String, price1: Int, author1: String) {
val id: Int = identifier
val title: String = title1
var price: Int = price1
val author: String = author1
override def toString: String = s" $title written by $author"
}
在我的BooksController类中,我正在定义基本CRUD操作。我想使用我要注入的FormFactory类做一些魔术。
import javax.inject._
import play.api.mvc._
import model.Book
import model.BookSet
import play.data._
import scala.collection.mutable.HashMap
@Singleton
class BooksController @Inject()(cc: ControllerComponents, formFactory: FormFactory) (implicit assetsFinder: AssetsFinder)
extends AbstractController(cc) {
//show a form
def create = {
val bookform: Form[Book] = formFactory.form(classOf[Book])
Ok(views.html.bookstore.create(bookform))
}
//show all books
def index = Action {
val map: HashMap[Int, Book] = BookSet.bookMap
Ok(views.html.bookstore.bookindex(map))
}
这是我的书店。创建scala.html文件
@import model.Book
@import helper._
@(bookForm: Form[Book])
<html>
<head>
<title>Create Book </title>
</head>
<body>
<h1> Create Book</h1>
@helper.form( action = routes.BooksController.save() ){
@helper.inputText(bookForm("id"))
@helper.inputText(bookForm("title"))
@helper.inputText(bookForm("price"))
@helper.inputText(bookForm("author"))
<input type="submit" value="Create Book">
}
</body>
</html>
这些是麻烦的代码行:
val bookform: Form[Book] = formFactory.form(classOf[Book])
Ok(views.html.bookstore.create(bookform))
在第二行,IntelliJ通知我 类型不匹配,预期play.api.data.Form [model.Book],实际play.data.Form [model.Book]
我尝试通过在html中添加以下行来解决此问题,但会导致错误(可能是由辅助类引起的)
@import play.data.Form
我还尝试过使用asInstanceOf []从工厂传递play.api.data.Form:
val bookform: Form[Book] = formFactory.form(classOf[Book])
Ok(views.html.bookstore.create(bookform.asInstanceOf[play.api.data.Form[Book]]))
尝试此操作后,在编译过程中出现错误: 找不到隐式的MessagesProvider实例。 P 租借请参阅https://www.playframework.com/documentation/2.6.x/ScalaForms#Passing-MessagesProvider-to-Form-Helpers [错误] @ helper.inputText(bookForm(“ title”))
基本上每个字段都重复一次。因此,我遵循了scala docs Option 2,并向控制器添加了注入和隐式请求以及对html文件的隐式请求。仍然出现相同的错误
在这一点上,我感到无助,这就是为什么我要问这个问题。 可以将play.data.FormFactory与助手类一起使用吗?不幸的是play.api.data包没有提供它自己的FormFactory。我觉得有一个显而易见的解决方案,我只是想念。 谢谢您的耐心
答案 0 :(得分:0)
我认为乍看之下,FormFactory
从未用于Scala,而仅用于Java。我对此可能是错的,但是我从未在Scala中使用过它。
如果您愿意尝试以下操作,则可能会更轻松:
只需将您的Book
更改为:
case class Book(identifier: Int, title: String, price: Int, author: String)
创建一个如下所示的表单:
val bookForm = Form(
mapping(
"id" -> number,
"title" -> nonEmptyText,
"price" -> number,
"author" -> nonEmptyText
)(Book.apply)(Book.unapply)
)
然后您的Controller
可能类似于以下内容:
@Singleton
class BooksController @Inject()(cc: ControllerComponents)
(implicit assetsFinder: AssetsFinder)
extends AbstractController(cc) {
//show a form
def create = {
Ok(views.html.bookstore.create(bookForm))
}
//show all books
def index = Action {
val map: HashMap[Int, Book] = BookSet.bookMap
Ok(views.html.bookstore.bookindex(map))
}
}
不确定AssetsFinder
,但是您可能有原因,因此我在示例中将其保留。 ;)