重头戏2 Scala:向该模型添加描述属性
以下代码来自: 型号:重头戏2 Scala:向该模型添加描述属性,scala,playframework-2.0,Scala,Playframework 2.0,以下代码来自: 型号: 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 =&g
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查询中
编辑:
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()
}
}
我也不确定如何在此处包含说明
:
def newTask = Action { implicit request =>
taskForm.bindFromRequest.fold(
errors => BadRequest(views.html.index(Task.all(), errors)),
label => {
Task.create(label)
Redirect(routes.Application.tasks)
}
)
目前,newTask是一种
表单[String]
:一种封装单个数据的表单,即字符串
您需要使用更复杂的表单来处理标签和描述。
您可以为这两个值定义一个case类
,或者只需使用Tuple
case class TaskForm(label: String, description: Form)
在这两种情况下,您至少需要进行以下修改:
**更改模板中的表单类型:
taskForm: Form[String] => taskForm: Form[(String, String)] // with a tuple
或
**现在,您可以在控制器中检索这些值
// with tuple
taskForm.bindFromRequest.fold(
errors => BadRequest(views.html.index(Task.all(), errors)),
values => { Task.create(values._1, values._2) .... }
或
当然,您必须添加第二个参数来创建(或传递caseclass/tuple对象)
仅供参考,值
、表单
和错误
是任意变量名。你可以选择你想要的
ps:您也需要调整表单(…)@alexchenco
values=>{Task.create(label,description)}
无效。你怎么知道什么是标签和描述?使用我的示例:values=>{Task.create(values.\u 1,values.\u 2)…}
。我准确地编写了values=>{Task.create(values.\u 1,values.\u 2)}
并且我得到了类型不匹配;发现:所需单元:play.api.mvc.Result
我见过一些这样的示例:错误=>BadRequest,{case(title,dueDate,assignedTo)=>
也可以用吗?和值=>{Task.create(values.\u 1,values.\u 2);重定向(routes.Application.tasks)
?此外,您的语法可能有效(我也看到了,但从未使用过)。奇怪的是,应用程序运行了,但当我想添加任务时,我得到了以下信息:[JdbcSQLException:Column count不匹配;SQL语句:insert-into task(label,description)value(?)(?)[21002-158]
我不使用Anorm,这是另一个问题=>首先检查文档;)
// with case class
taskForm.bindFromRequest.fold(
errors => BadRequest(views.html.index(Task.all(), errors)),
form => { Task.Create(form.label, form.description) }
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()
}
}