关于Scala:无法在Play框架中将参数传递给反向路由器

Can't pass parameter to reverse router in playframework

我已经定义了一条这样的路线:

1
GET /login controllers.Login.showForm(continue: Option[String] = None)

Login.showForm是这样的:

1
2
3
4
5
6
7
def showForm(continue: Option[String] = None) = Action { implicit request =>
    val nextPage = continue match {
      case None => routes.CtrlIndex.index().absoluteURL().toString()
      case Some(page) => page
    }
    Ok(views.html.login(nextPage))
  }

现在,使用动作组合,我进行了一个经过身份验证的动作,该动作在用户未经过身份验证时执行此操作:

1
2
3
4
val continue =
  if (request.method =="GET") request.uri
  else routes.CtrlIndex.index().absoluteURL().toString() // This is not code duplication for reasons that are out of the scope of this question.
Redirect(routes.Login.showForm(Some(continue)))

无法通过以下消息进行编译:

1
2
too many arguments for method showForm: ()play.api.mvc.Call
[error] Redirect(routes.Login.showForm(Some(continue)))

更改路线定义可以使其起作用:

1
GET /login controllers.Login.showForm(continue: Option[String])

但是当我使用javascript反向路由器时,它会在生成的javascript中生成以下错误:

1
2
3
SyntaxError: missing formal parameter
function(continue) {
---------^

我已经尝试过所有功能签名定义的组合,但是当javascript工作时,其他功能将停止工作或以其他方式停止工作。如何使用

  • / login上的可选参数
  • 使用反向JavaScript路由器
  • 使用" continue"参数重定向到/ login
  • 我还想将request.uri更改为返回绝对路径的内容。

预先感谢

PS。如果您看到的是西班牙文,请告诉我们,我们将对其进行修复,因为该代码最初是西班牙文;即使阅读后,我可能也会错过某些东西。


可能的原因是" continue"是javascript中的保留字。

Play的javascript反向路由器使用路由文件中指定的控制器路径和方法参数来构造给定的路由;在您的情况下," continue"可能会导致js解析器崩溃,就像名为" delete"的方法一样,该方法在服务器端可以正常工作,但会在客户端反向路由器中崩溃。

对于较新的浏览器来说,这可能不是问题,但已在较旧版本的Internet Explorer(我们需要支持)上被"删除"方法名所咬。