适用于方法的参数太多:(car:play.api.data.Form [models.CarroFormData])

时间:2016-01-23 18:00:04

标签: scala playframework

我有这个错误,无法找到解决方案或如何调试传递给应用的内容。 有人可以帮忙吗?

  

适用方法的论据太多:(汽车:   play.api.data.Form [models.CarroFormData])(隐含消息:   play.api.i18n.Messages)play.twirl.api.HtmlFormat.Appendable in class   索引

控制器表格

def add = Action { implicit request =>
    CarroForm.form.bindFromRequest.fold(
      // if any error in submitted data
      errorForm => Ok(views.html.admin.index(errorForm, Seq.empty[Carro])),
      data => repo.create(carro.name, carro.description, carro.img, carro.keywords).map { _ =>
          // If successful, we simply redirect to the index page.
          Redirect(routes.application.index)
        })
  }

这是模型

package dal

import javax.inject.{ Inject, Singleton }
import play.api.db.slick.DatabaseConfigProvider
import slick.driver.JdbcProfile

import models._

import scala.concurrent.{ Future, ExecutionContext }

/**
 * A repository for people.
 *
 * @param dbConfigProvider The Play db config provider. Play will inject this for you.
 */
@Singleton
class CarroRepository @Inject() (dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext) {
  // We want the JdbcProfile for this provider
  private val dbConfig = dbConfigProvider.get[JdbcProfile]

  // These imports are important, the first one brings db into scope, which will let you do the actual db operations.
  // The second one brings the Slick DSL into scope, which lets you define the table and other queries.
  import dbConfig._
  import driver.api._

  /**
   * Here we define the table. It will have a name of people
   */
  private class CarroTable(tag: Tag) extends Table[Carro](tag, "carro") {

    /** The ID column, which is the primary key, and auto incremented */
    def id = column[Long]("id", O.PrimaryKey, O.AutoInc)

    /** The name column */
    def name = column[String]("name")

    /** The description column */
    def description = column[String]("description")

    /** The img column */
    def img = column[String]("img")

    /** The keywords column */
    def keywords = column[String]("keywords")

    /**
     * This is the tables default "projection".
     *
     * It defines how the columns are converted to and from the Person object.
     *
     * In this case, we are simply passing the id, name and page parameters to the Person case classes
     * apply and unapply methods.
     */
    def * = (id, name, description, img, keywords) <> ((Carro.apply _).tupled, Carro.unapply)
  }

  /**
   * The starting point for all queries on the people table.
   */
  private val carro = TableQuery[CarroTable]

  /**
   * Create a person with the given name and age.
   *
   * This is an asynchronous operation, it will return a future of the created person, which can be used to obtain the
   * id for that person.
   */
  def create(name: String, description: String, img:String, keywords: String): Future[Carro] = db.run {
    // We create a projection of just the name and age columns, since we're not inserting a value for the id column
    (carro.map(p => (p.name, p.description, p.img, p.keywords))
      // Now define it to return the id, because we want to know what id was generated for the person
      returning carro.map(_.id)
      // And we define a transformation for the returned value, which combines our original parameters with the
      // returned id
      into ((nameAge, id) => Carro(id, nameAge._1, nameAge._2, nameAge._3, nameAge._4))
    // And finally, insert the person into the database
    ) += (name, description, img, keywords)
  }

  /**
   * List all the people in the database.
   */
  def list(): Future[Seq[Carro]] = db.run {
    carro.result
  }

}

包装模型

import play.api.data.Form
import play.api.data.Forms._

import play.api.libs.json._

case class Carro(id: Long, name:String, description:String, img:String, keywords:String)

case class CarroFormData(name: String, description: String, img: String, keywords: String)

object CarroForm {

  val form = Form(
    mapping(
      "name" -> nonEmptyText,
      "description" -> nonEmptyText,
      "img" -> nonEmptyText,
      "keywords" -> nonEmptyText
    )(CarroFormData.apply)(CarroFormData.unapply)
  )
}

object Carros {

  var carros: Seq[Carro] = Seq()

  def add(carros: Carro): String = {
    carros = carros :+ carro.copy(id = carro.length) // manual id increment 
    "User successfully added"
  }

  def delete(id: Long): Option[Int] = {
    val originalSize = carro.length
    carro = carro.filterNot(_.id == id)
    Some(originalSize - carro.length) // returning the number of deleted users
  }

  def get(id: Long): Option[Carro] = carro.find(_.id == id)

  def listAll: Seq[Carro] = carro

  implicit val carroFormat = Json.format[Carro]

}

查看代码

@(car: Form[CarroFormData])(implicit messages: Messages)

@import helper._

@main(new Main("Car Dealers", "Compra e venda de carros", "logo.png", "carro, compra, venda")) {
    <div class="container">
        <h1>Hello</h1>
@form(routes.AdminCarro.add()) {
        @inputText(person("name"))
        @inputText(person("description"))
        @inputText(person("img"))
        @inputText(person("keywords"))
        )

        <div class="buttons">
            <input type="submit" value="Add Car"/>
        </div>
    }
    </div>
}

1 个答案:

答案 0 :(得分:0)

在你的控制器代码:

def add = Action { implicit request =>
  CarroForm.form.bindFromRequest.fold(
    // if any error in submitted data
    errorForm => Ok(views.html.admin.index(errorForm, Seq.empty[Carro])),
    data => repo.create(carro.name, carro.description, carro.img, carro.keywords).map { _ =>
      // If successful, we simply redirect to the index page.
      Redirect(routes.application.index)
    }
  )
}

errorForm,您使用两个参数调用索引视图:

Ok(views.html.admin.index(errorForm, Seq.empty[Carro]))

但你的观点只宣称一个论点:

@(car: Form[CarroFormData])(implicit messages: Messages)

只需从控制器中的呼叫中删除Seq.empty[Carro],一切都应按预期工作。如果您仍然遇到相同的错误,请查看是否有其他地方以相同的错误方式(使用两个参数)调用此视图,或者在sbt clean之前尝试sbt run您的项目。