W sumie to zaciekawilo mnie to, wiec chyba cos mam.
Najpierw polecimy z pokazem, jak wyglada akcja po 'modyfikacjach':
def searchImproved(tokens: Tokens) = Action {
Ok(tokens.name + " " + tokens.lastName + " " + tokens.age.toString)
}
Klasa Tokens
:
case class Tokens(name: String, lastName: String, age: Int)
conf/routes
:
GET /app/searchImproved controllers.Application.searchImproved(tokens: models.Tokens)
Dodatkowo trzeba dodac w build.sbt
:
routesImport += "Binders._"
Uzycie takie samo jak poprzednio:
I teraz cala magia, dzieki ktorej to dziala:
object Binders {
implicit def queryStringBinder(implicit stringBinder: QueryStringBindable[String],
intBinder: QueryStringBindable[Int]) =
new QueryStringBindable[Tokens] {
override def bind(key: String, params: Map[String, Seq[String]]): Option[Either[String, Tokens]] = {
for {
name <- stringBinder.bind("name", params)
lastName <- stringBinder.bind("lastName", params)
age <- intBinder.bind("age", params)
} yield {
(name, lastName, age) match {
case (Right(name), Right(lastName), Right(age)) => Right(Tokens(name, lastName, age))
case _ => Left("Unable to bind Tokens.")
}
}
}
override def unbind(key: String, tokens: Tokens): String = {
stringBinder.unbind("name", tokens.name) + "&" +
stringBinder.unbind("lastName", tokens.lastName) + "&" +
intBinder.unbind("age", tokens.age)
}
}
}
Na razie nie obsluguje opcjonalnych parametrow, ale spokojnie mozna dodac.
Uwaga uzywanie tego dla kazdej bzdury to ostry overkill
PS. Sa tu jakies znaczniki dla Scali, czy jakich mam uzywac :(
PS2. Uzywanie Scali z Play na windowsie to jakis koszmar jest, albo ja nie umiem tego jakos ustawic, zeby dzialalo.