Scala JavaScript Routing Play Framework

随声附和 提交于 2020-01-15 10:27:09

问题


I'm using Play framework with Scala. I'm facing a weird error and can't figure out what's the solution. The error message is:

value Track is not a member of object 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

The new error is :

1@(message: String)

2

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

4    

5    @play20.welcome(message)

6    

7}

index.scala.html at line 3. Cannot find any HTTP Request Header here

It says index.scala but I have never changed it.


回答1:


Your javascript route is defined as:

GET     /javascriptRoutes           controllers.TrackController.javascriptRoutes

Edit: play uses a special reverse route for javascript, under routes.javascript.

so your reverse controller will be at controllers.routes.javascript.TrackController.Track:

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

You also need to make an implicit RequestHeader available in your template. So add at the beginning of your template:

@(implicit request: RequestHeader)

Or if you already have template parameters:

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

And make sure it is available in your controller's Action:

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

If that view (let's call it main) is called from within another view (let's say index), then index also needs an implicit RequestHeader parameter as well, to be able to pass it down to main.




回答2:


Because your controller's name is TrackController, so try to change this code:

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

with this:

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


来源:https://stackoverflow.com/questions/16941341/scala-javascript-routing-play-framework

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!