无法在play框架中将参数传递给反向路由器

时间:2014-09-12 16:57:45

标签: scala playframework playframework-2.3

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

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

Login.showForm是这样的:

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))
  }

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

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)))

使用此消息无法编译:

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

更改路线定义使其有效:

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

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

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

我已经尝试了函数签名定义的所有组合,但是当javascript工作时,另一个停止工作或反过来。我该如何使用

  • / login
  • 上的可选参数
  • 使用反向javascript路由器
  • 使用&#34重定向到/ login;继续"参数
  • 我还想更改request.uri以获取返回绝对路径的内容。

提前致谢

PS。如果你看到西班牙语的东西,让我知道,我会解决它,代码最初是西班牙语;在我阅读之后,我可能已经遗漏了一些东西。

1 个答案:

答案 0 :(得分:1)

可能的原因是“继续”是javascript中的reserved word

Play的javascript反向路由器使用routes文件中指定的控制器路径和方法参数构造给定路由;在你的情况下,“继续”可能会绊倒js解析器,就像一个名为“delete”的方法,它在服务器端运行良好,但会在客户端反向路由器中爆炸。

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