【问题标题】:Scala JavaScript Routing Play FrameworkScala JavaScript 路由播放框架
【发布时间】:2017-02-09 11:02:59
【问题描述】:

我正在使用带有 Scala 的 Play 框架。我面临一个奇怪的错误,无法弄清楚解决方案是什么。错误信息是:

value Track 不是对象 controllers.routes.javascript 的成员

<script type="text/javascript" src="@routes.TrackController.javascriptRoutes"></script>

  @helper.javascriptRouter("jsRoutes")(
    routes.javascript.Track
  )

def Track(id:Long)= Action {implicit request =>
    Ok(views.html.track(
        new TrackData(TrackClient.getTrack(id))))


  }

 def javascriptRoutes = Action { implicit request =>

 Ok(
         Routes.javascriptRouter("jsRoutes")    (routes.javascript.TrackController.Track)).as("text/javascript")
    }
#JavaScriptRouting
GET     /track/:id                  @controllers.TrackController.Track(id: Long)
GET     /javascriptRoutes           @controllers.TrackController.javascriptRoutes

新的错误是:

1@(message: String)

2

3@main("Welcome to Play 2.1") { 

4    

5    @play20.welcome(message)

6    

7}

第 3 行的 index.scala.html。在此处找不到任何 HTTP 请求标头

上面写着 index.scala 但我从未更改过它。

【问题讨论】:

  • 哦,您上面粘贴的部分是在main 模板中?那么所有调用@main的模板都需要第二个参数列表(implicit request: RequestHeader)。这里是@(message: String)(implicit request: RequestHeader)edit:所有调用这些模板的控制器都需要在Action开头的implicit request =&gt;
  • 好的,非常感谢 =) 我现在还有一些其他错误,我会尝试解决它们
  • 我还有一个关于我的测试的问题,现在我如何在我的测试中实现这些更改(隐式请求:RequestHeader)
  • 还有@supertrackGraph(data.graph) 这行说在这里找不到任何http请求头
  • 有一个FakeRequest 可以在测试控制器或视图时使用,例如view.html.index(&lt;params&gt;)(FakeRequest())。对于您的其他错误,是否在视图中调用了@supertrakGraph(...)?然后那个人也需要一个隐式请求

标签: scala playframework


【解决方案1】:

您的 javascript 路由定义为:

GET     /javascriptRoutes           controllers.TrackController.javascriptRoutes

编辑:play 在routes.javascript下使用一个特殊的javascript反向路由。

所以你的反向控制器将位于controllers.routes.javascript.TrackController.Track:

@helper.javascriptRouter("jsRoutes")(
  routes.javascript.TrackController.Track
)

您还需要在模板中提供隐式RequestHeader。所以在模板的开头添加:

@(implicit request: RequestHeader)

或者如果你已经有模板参数:

@(<your parameters>)(implicit request: RequestHeader)

并确保它在您的控制器的Action 中可用:

def myController = Action { implicit request => // <-- request is a RequestHeader
  // ...
  Ok(views.html.myView)
}

如果从另一个视图(比如说index)中调用该视图(我们称之为main),那么index 还需要一个隐式RequestHeader 参数,以便能够将其传递下去到main

【讨论】:

  • 当我应用这个解决方案时,结果是:描述资源路径位置类型类型不匹配;找到:play.api.mvc.Call required:play.core.Router.JavascriptReverseRoute main.template.scala /ubit/target/scala-2.10/src_managed/main/views/html 第48行Scala问题
  • 哎呀,对不起,路由器的路径错误;固定的。然后,您将运行与@mohammed-gh 的答案相同的错误。我还添加了如何解决这个问题。
  • 好吧,我正在尝试解决这个问题,但仍然是同样的错误:首先我做了:@(title: String)(content: Html)(implicit request: RequestHeader) 然后@helper.javascriptRouter(" jsRoutes")( routes.javascript.TrackController.Track ) 到头部周围的某个地方
  • 嗯,你还是得到“在这里找不到 HTTP 请求头”吗? @helper.javascriptRouter("jsRoutes")( routes.javascript.TrackController.Track)(request)呢?
  • 不,这次我在 index.template.scala 中有 6 个,在 eclipse 上还有 5 个其他模板,当我通过浏览器编译时它说:@main("Welcome to Play 2.1") { -
【解决方案2】:

因为你的控制器的名字是TrackController,所以试着改一下这段代码:

@helper.javascriptRouter("jsRoutes")(
  routes.javascript.Track
)

用这个:

@helper.javascriptRouter("jsRoutes")(
  routes.javascript.TrackController.Track
)

【讨论】:

  • 当我应用这个错误信息是:Cannot find any HTTP Request Header here
猜你喜欢
  • 2014-06-12
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
相关资源
最近更新 更多