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"))
.
syntax:
By analogy you can also generate urls in your controllers. ie. for redirecting after some action:
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.The format for putting a URL from your
routes
file in your html is as follow:So, if in your
routes
file you have:And your
Products
class looks like this:Your
<a>
should look like this: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.
Ah, as simple as
@{routes.Application.show("tag")}
.