以下代码来自Play 2 ScalaTodoList tutorial:
模型:
case class Task(id: Long, label: String)
object Task {
val task = {
get[Long]("id")~
get[String]("label") map {
case id~label => Task(id, label)
}
}
def all(): List[Task] = DB.withConnection { implicit c =>
SQL("select * from task").as(task *)
}
def create(label: String) {
DB.withConnection { implicit c =>
SQL("insert into task (label) values ({label})").on(
'label -> label
).executeUpdate()
}
}
现在,我正在尝试添加名为描述的第三个属性:
case class Task(id: Long, label: String, description: String)
object Task {
val task = {
get[Long]("id")~
get[String]("label")~
get[String]("description") map {
case id~label~description => Task(id, label, description)
}
}
(我是Scala初学者,不确定我是否做得对)
但我陷入了def create
方法。如何将description
包含在SQL查询中?
修改
我也不确定如何在此处加入description
:
def newTask = Action { implicit request =>
taskForm.bindFromRequest.fold(
errors => BadRequest(views.html.index(Task.all(), errors)),
label => {
Task.create(label)
Redirect(routes.Application.tasks)
}
)
答案 0 :(得分:2)
目前,newTask是一个Form[String]
:一个封装单个数据的表单,一个字符串。
您需要使用更复杂的表单来处理标签和说明。
您可以为这两个值定义case class
,或者只使用Tuple
case class TaskForm(label: String, description: Form)
在这两种情况下,您至少要进行修改:
**更改模板中的表单类型:
taskForm: Form[String] => taskForm: Form[(String, String)] // with a tuple
或
taskForm: Form[String] => taskForm: Form[TaskForm] // with the case class defined above
**现在,您可以在控制器中检索这些值
// with tuple
taskForm.bindFromRequest.fold(
errors => BadRequest(views.html.index(Task.all(), errors)),
values => { Task.create(values._1, values._2) .... }
或
// with case class
taskForm.bindFromRequest.fold(
errors => BadRequest(views.html.index(Task.all(), errors)),
form => { Task.Create(form.label, form.description) }
当然,您必须向Create(或传递caseclass / tuple对象)添加第二个参数
def create(label: String, description: String) {
DB.withConnection { implicit c =>
SQL("insert into task (label, description) values ({label}, {description})").on(
'label -> label,
'description -> description
).executeUpdate()
}
}
仅供参考,values
,form
和errors
是任意变量名称。你可以选择你想要的东西。
ps:你需要调整你的表格(...)