Play-Scala:如何使用方法重载?

时间:2013-01-30 12:43:36

标签: scala playframework playframework-2.0

我想用不同的输入进行拖曳动作,并让一个人能够打电话给另一个:

def showQuestion(questionId :Long)=Action{
     Redirect(routes.Application.showQuestion(Question.find.byId(questionId)))
 }
 def showQuestion(question :Question)=Action{
    Ok(views.html.show(question))
 }

我尝试了以上但没有运气。编译抱怨:

found   : models.Question
[error]  required: Long
[error]      Redirect(routes.Application.showQuestion(Question.find.byId(questionId)))

指的是第一个。

2 个答案:

答案 0 :(得分:1)

我认为你错过了什么。

routes文件中,您无法将网址映射到第二个操作:

GET /question/:id    controllers.Question.showQuestion(id: Long)
GET /question/:question    controllers.Question.showQuestion(question: Question) // <== how to map the "question" in the Url ???

那么为什么不这样呢(在这种情况下,使用两种方法并不相关):

def showQuestion(questionId: Long)=Action{
     showQuestion(Question.find.byId(questionId))
}

private def showQuestion(question: Question)=Action{
    Ok(views.html.show(question))
}

答案 1 :(得分:0)

这不是一个直接的答案,但有一点值得思考:

  1. 路由器的主要任务是从请求到函数的args的转换类型验证,所以最好使用一些常见类型,例如{{1} },StringInt等,用于标识数据库中的对象,而不是尝试通过路由器传递整个对象。实际上你的第一条路线就是这样做的。
  2. 我找不到任何合理的理由来使用两个单独的动作来查找对象和渲染模板(在其他动作中找到对象)。更重要的是,您正试图通过Bool执行此操作,因此会创建两个请求,这是多余的!您应该删除第二条路线并使用一个操作:

    Redirect
  3. 如果您确实想要将其拆分为两个单独的函数,请使用 @nico_ekito 的示例,我认为您也可以在这种情况下删除第二条路径。

  4. 如果将来你想要重载函数......最好不要这样做:)重载很好,当你有静态方法可以在很多地方使用时它可以与参数的数量等不同最有可能的是,使用不同的动作名称(即使路线类似)也会更加舒适:

    GET /question/:id    controllers.Question.showQuestion(id: Long)
    
    def showQuestion(questionId: Long)=Action{
       Ok(views.html.show(Question.find.byId(questionId)))
    }