How to insert link to controller action in Play fr

2019-06-15 07:14发布

问题:

If I have an action Application.show(tag: String), and also have a corresponding routing entry, how can I insert a link to this action to a template without crafting the url manually?

I would like to do something like magiclink(Application.show("tag")).

回答1:

syntax:

<a href='@routes.Application.show("some")'>My link with some string</a>

By analogy you can also generate urls in your controllers. ie. for redirecting after some action:

public static Result justRedirect(){

    // use as String
    String urlOfShow = routes.Application.index().toString().

    // or pass as a redirect() arg
    return redirect(routes.Application.show("some"));
}


回答2:

The format for putting a URL from your routes file in your html is as follow:

@routes.NameOfYourClass.nameOfyourMethod()

So, if in your routes file you have:

GET     /products                   controllers.Products.index()

And your Products class looks like this:

public class Products extends Controller {

    public Result index() {
        return ok(views.html.index.render());
    }
}

Your <a> should look like this:

<a href="@routes.Products.index()">Products</a>

In addition: If your method can accept parameters, then you can of course pass them in between the parenthesize of your method like this: index("Hi").

I hope this answer is more clear to understand.



回答3:

Ah, as simple as @{routes.Application.show("tag")}.



回答4:

The accepted answer is right, but it doesn't cover the case where the controller is in a sub-package, i.e.: controllers.applications.MyFavouriteApplication.show()

Since I had a hard time finding the answer, I'll post it here.

To put a non-scoped link into a template, the proper pattern is @controllers.{sub-packages if any}.routes.{your class}.{your method}()

So in this case it would be @controllers.applications.routes.MyFavouriteApplication.show()

IF you were using the recommended Play pattern of using @Inject to create singleton controller objects, and IF you thought the correct answer was @controllers.applications.MyFavouriteApplication.show(), you would get an error like this:

Object MyFavouriteApplication is not a member of controllers.applications. Note: class MyFavouriteApplication exists, but it has no companion object.

Given that you had already supplied the @Inject() @Singleton annotation, this would seem like a very strange error indeed. It might make you question if you were building the project correctly. Determining the true cause could cost you considerably in blood and treasure.