【问题标题】:provide own unapply method in play framework 2 with scala and circumflex-orm class在带有scala和circumflex-orm类的play framework 2中提供自己的unapply方法
【发布时间】:2012-04-19 17:00:30
【问题描述】:

我想将 play 2.0 框架中的表单绑定与从circumflex-orm (website) 扩展 Record 的类结合起来。

这些是我的类对象:

class Task extends Record[Long, Task] with IdentityGenerator[Long, Task] {  
  def this(name: String, description: String) = {
    this()
    this.name := name
    this.description := description
}

  val id = "id".BIGINT.NOT_NULL.AUTO_INCREMENT
  val name = "name".VARCHAR(255).NOT_NULL
  val description = "description".TEXT.NOT_NULL

  def PRIMARY_KEY = id
  def relation = Task
}

这就是我尝试用播放形式做的事情:

val taskForm: Form[Tasks] = Form(
  mapping(
    "name" -> text,
    "description" -> text
  )
  {(name, description) => Task(name, description)}
  {(t: Task) => Option(t.name(), t.description())  }
)

但我收到这样的错误:

found   : models.Task => Option[(String, String)]
required: Unit => Option[(String, String)]
  {(t: Task) => Option(t.name(), t.description())}

如果我将 Option 替换为 Some:

found   : models.Task => Some[(String, String)]
required: Unit => Option[(String, String)]
  {(t: Task) => Some(t.name(), t.description())}

我现在一无所知,任何提示将不胜感激。

非常感谢。

编辑:我犯了一个基本错误,我确实命名了表单:

val taskForm: Form[Tasks] = Form(

当类的名称是“任务”时。所以我可以把它改成:

val taskForm: Form[Task] = Form(
  mapping(
      "name" -> text,
      "description" -> text
  ) ( (name, description) => Task ) 
  ( (t: Task) => Option() )
)

现在我得到一个不同的错误:

Unspecified value parameter x
  ( (t: Task) => Option() )

我在eclipse中做了一个简单的项目,需要的依赖,你可以在这里下载看看,如果有帮助的话: Basic Form Example

【问题讨论】:

  • 我认为() => Some(t.name(), t.description()) 应该有帮助
  • 然后它说:方法应用的参数太多:(x: A)Some[A] in object Some / {() => Some(t.name(), t.description() ) }

标签: forms scala orm playframework-2.0 circumflex-orm


【解决方案1】:

我的评论有误,以下 sn-p 对我有用。

case class Foo(x: String, y: String)

val taskForm = Form(
  mapping(
    "name" -> text,
    "description" -> text)
  ((name, description) => Foo(name, description))
  ((t: Foo) => Some(t.x, t.y)))

更新

我在依赖项中添加了抑扬符并尝试了您的确切示例。它对我来说编译得很好,我刚刚添加了

object Task extends Task with Table[Long, Task]

我相信您忘记将其包含在问题中。所以我只能建议清理和重建整个项目。

附:我换行了

{ (name, description) => new Task(name, description) }

但很明显。

【讨论】:

  • 感谢您的努力,但这与我提供的代码基本相同,除了我使用“{}”的“()”。它给出了与我的问题相同的错误。它不工作-.-
  • 没注意到:) 现在我明白了,这是 Task 类的东西。
  • 嗯,就是这样。看起来很干净,从 Form[Tasks] 重命名为 Form[Task] 解决了它。现在可以了。非常感谢。
【解决方案2】:

主要问题是如果你使用circumflex,你不会编写case类,所以默认情况下你没有apply和unapply方法。

你必须像这样在你的任务伴侣对象中编写你自己的应用和取消应用方法:

    object Taks extends Task with Table[Long, Task] {
        def apply(name:String,description:String) = {
            var t = new Task()
            t.name := name
            t.description := description
            t
        }
        def unapply(t:Task) = Some(t.name(),t.description())
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多