重头戏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()
   }
 }