Play 2 Scala:为此模型添加描述属性

时间:2012-12-20 04:38:12

标签: scala playframework-2.0

以下代码来自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)
      }
    )

1 个答案:

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

仅供参考,valuesformerrors是任意变量名称。你可以选择你想要的东西。

ps:你需要调整你的表格(...)