【问题标题】:How to add a extra field in todo application如何在 todo 应用程序中添加额外的字段
【发布时间】:2013-09-22 20:19:51
【问题描述】:

如何在使用 Scala 的 Play 框架创建的待办事项应用程序中添加额外的字段?我正在使用异常数据库...我在第 24 行的 Application.scala 中收到一个名为 "not found: value Task" 的错误。我已经尝试过了,请指出我的错误。提前致谢!

task.scala:

package models

import anorm._
import anorm.SqlParser._
import play.api.db._
import play.api.Play.current


case class Task(id: Long, label: String, name: String)

object Task {
  val task = {
    get[Long]("id") ~ 
    get[String]("label") ~ 
    get[String]("name") map {
      case label~name => Task(id, name)
      case id~label => Task(id, label)
    }
  }

  def all(): List[Task] = DB.withConnection { implicit c =>
    SQL("select * from task").as(task *)
  }
  def create(task: Task): Unit= {
    DB.withConnection { implicit c =>
      SQL("insert into task (label,name) values ({label},{name})").on(
        'label -> label,
        'name  -> name
      ).executeUpdate()
    }
  }

  def delete(id: Long) {
    DB.withConnection { implicit c =>
      SQL("delete from task where id = {id}").on(
        'id -> id
      ).executeUpdate()
    }
  }
}

application.scala(控制器类):

package controllers

import play.api._
import play.api.mvc._
import play.api.data._
import play.api.data.Forms._

import play.api.data.Form
import play.api.data.Forms.{tuple,nonEmptyText}
import play.api.mvc.{Action, Controller}
import anorm.NotAssigned

import models.Task

object Application extends Controller {
  def index = Action {
    Redirect(routes.Application.tasks)
  }
  val taskForm = Form(
    tuple(
      "label" -> nonEmptyText,
      "name" -> nonEmptyText
    )
  )

  def tasks = Action {
    Ok(views.html.index(Task.all(), taskForm))
  }
  def showTask= Action {
    Ok(views.html.test(Task.all(), taskForm))
  }

  def newTask = Action { implicit request =>
    taskForm.bindFromRequest.fold(
      errors => BadRequest(views.html.index(Task.all(), errors)),
      {
        case (label, name) => {
          Task.create(Task(NotAssigned, label, name))
          Redirect(routes.Application.showTask)
        }
      }
    )
  }

  def deleteTask(id: Long) = Action {
    Task.delete(id)
    Redirect(routes.Application.showTask)
  }
}

索引(查看文件):

@(tasks: List[Task], taskForm: Form[(String, String)])

@import helper._

<h2>Add a new task</h2>

@form(routes.Application.newTask) {

  @inputText(taskForm("label")) 
  @inputText(taskForm("name"))

  <input type="submit" value="Create">
}

test.html(查看文件2):

@(tasks: List[Task], taskForm: Form[(String,String)])

@import helper._

@main("Todo list") {
  <h1>@tasks.size task(s)</h1>

  <ul>
    @tasks.map { task =>
      <li>
        <b>@task.label</b>
        <b>@task.name</b>

        @form(routes.Application.deleteTask(task.id)) {
          <input type="submit" value="Delete">
        }
      </li>
    }
  </ul>  
}

【问题讨论】:

    标签: scala playframework-2.0 anorm


    【解决方案1】:

    尝试使用:

    (应用)和(不应用)

    表单元素的正确方法。

    (Task.apply)(Task.unapply)
    

    【讨论】:

      【解决方案2】:

      import models.Task._ 将伴随对象 models.Task 上的所有方法导入当前范围,而不是 Task 类和对象本身。因此,当前代码将允许您只调用 all 并引用 Task.all

      将导入更改为 import models.Task 以将 Task 放入您的 Application 对象的范围内,您将能够像尝试一样使用任务方法。

      【讨论】:

      • 如果我更改导入,它会返回以下错误类型不匹配;找到:play.api.data.Form[(String, String)] 需要:play.api.data.Form[String]
      • 这意味着在您的 index.scala.html 模板参数列表中,您已经说过您的模板采用 Form[String] 但您给它的 taskForm 是 Form[(String, String) ]
      • 考虑到您遇到的这些问题,我建议您先阅读 Scala 初学者教程,而不是尝试同时学习 Scala 和 Play。
      • 感谢您的建议。我按照您所说的进行了更改,更改了视图文件中的参数..在最后阶段完成这些参数后,我在控制器案例类中遇到如下错误,类型不匹配;发现: anorm.NotAssigned.type required: Long
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      相关资源
      最近更新 更多