【问题标题】:Play framework routes, and scala predef values播放框架路由和 scala predef 值
【发布时间】:2014-06-12 10:53:54
【问题描述】:

我在 play framework 2.2 上开发应用程序 我有一个这样的路由文件:

GET  /posting/          controllers.posting.BlogController.allPosts()
GET  /posting/:number   controllers.posting.BlogController.allPosts(number: Int)

还有 BlogContriller:

object BlogController extends Controller {

  def allPosts(pageNumber:Int = 1, postsPerPage:Int = 10) = Action{
    val posts = Post.getLastNPosts(postsPerPage, postsPerPage*(pageNumber-1))
    val htmlPosts = new Html(new StringBuilder());

    for (post <- posts){
      val htmlPost = views.html.posting.post(post.getName, post.getText, post.getDate.toString)
      htmlPosts += htmlPost;
    }

    Ok(views.html.posting.index(htmlPosts))
  }
}

当我试图解释它时,我给出了一个错误:

Error:(14, -1) Play 2 Compiler:  C:\...\conf\routes:14: Compilation error[Using different overloaded methods is not allowed. If you are using a single method in combination with default parameters, make sure you declare them all explicitly.]
GET  /posting/:number   controllers.posting.BlogController.allPosts(number: Int)

我不明白如何解决这个问题。谁能帮帮我?

【问题讨论】:

    标签: scala playframework playframework-2.2


    【解决方案1】:

    你可以使用带默认值的参数:

    GET  /posting/          controllers.posting.BlogController.allPosts(number: Int = 1)
    GET  /posting/:number   controllers.posting.BlogController.allPosts(number: Int)
    

    您不能使用重载方法allPosts(Int)allPosts。由于您使用两个具有默认值的参数声明了 allPosts,因此 Scala 将此方法视为 4 种不同的方法。您只能使用其中一种。

    【讨论】:

    • 不起作用。我有一个新错误:“不允许为参数指定固定值或默认值:从路径中提取的‘数字’”
    【解决方案2】:

    您必须为同一函数定义所有参数。在你的情况下allPosts。为不需要该参数的路由提供默认值。

    GET  /posting/          controllers.posting.BlogController.allPosts(number: Int ?= 0)
    

    GET /posting/:number controllers.posting.BlogController.allPosts(number: Int)

    【讨论】:

      【解决方案3】:

      您也可以使用可选参数。类似的东西

      GET  /posting/          controllers.posting.BlogController.allPosts(number: Option[Int])
      GET  /posting/:number   controllers.posting.BlogController.allPosts(number: Int)
      

      然后您可以在查询中使用或不使用参数来调用它:

      /posting?number=1
      /posting
      

      确保您在控制器中也声明了一个选项

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-09
        • 2018-04-08
        • 1970-01-01
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多