2012-07-07 11 views
6

Estoy implementando una aplicación web usando el framework de reproducción scala 2.0.2. Me gustaría extraer y validar una serie de parámetros de obtención. Y para esto estoy usando una "forma" de juego que me permite definir campos opcionales.Cómo definir valores predeterminados campos opcionales en formularios de marcos de juego?

Problema: Para esos campos opcionales, necesito definir un valor predeterminado si el parámetro no se pasa. El código está destinado a analizar correctamente estos casos tres uso:??

  • /test top = abc (error, abc no es un entero)
  • /test top = 123 (válido, la parte superior es de 123)
  • /prueba (válida, la parte superior es de 42 (valor por defecto))

he llegado con el siguiente código:

def test = Action { 
    implicit request => 

    case class CData(top:Int) 

    val p = Form(
    mapping(
     "top" -> optional(number) 
    )((top) => CData($top.getOrElse(42))) ((cdata:CData) => Some(Some(cdata.top))) 
).bindFromRequest() 

    Ok("all done.") 
} 

El código funciona, pero definitivamente no es elegante. Hay una gran cantidad de placa de caldera funcionando solo para configurar un valor predeterminado para un parámetro de solicitud faltante.

¿Alguien puede sugerir una solución más limpia y más coincidente?

Respuesta

8

Este es el trabajo del enrutador para validar los parámetros de cadena de consulta. Basta con definir el parámetro en el archivo routes:

GET /test controllers.Application.test(top: Int ?= 42) 

Y añadir top como un parámetro para el método de control:

def test(top: Int) = Action { 
    // Use top here 
    val data = CData(top) 
} 

Entonces, Juego hacer todo el trabajo de validación para usted. Tenga en cuenta cómo el valor predeterminado especificado mediante la sintaxis ?=.

Debe usar formularios solo para solicitudes POST.

Actualización:

Si se desea comprobar manualmente los parámetros, entonces se podría definir método de ayuda:

def getQueryParam(key: String, default: String)(implicit request: RequestHeader) = 
    request.queryString.get(key).flatMap(_.headOption).getOrElse(default) 

y utilizarlo dentro de sus métodos de controlador:

def test = Action { implicit request => 
    val top = getQueryParam("top", "42") 
    ... 

Pero al hacer esto, pierdes el control de tipos. Por supuesto, puede definir ayudantes para cada tipo, es decir, getIntParam, getStringParam y así sucesivamente, pero Play ya contiene una implementación de enrutador seguro, diseñada para resolver ese tipo de problemas. Te aconsejo que uses el mecanismo de enrutamiento en lugar de la verificación manual.

+0

Esta solución propuesta funciona bien. El único inconveniente de esta solución desafortunadamente es que no escala bien con una gran cantidad de parámetros predeterminados. Cuando crea un servicio web/aplicación web que debe admitir el filtrado de listados, exponer todos los parámetros predeterminados en la ruta puede reducir la legibilidad y la legibilidad del código.En todos los demás escenarios, esta es de hecho la solución preferida – natbusa

+1

Respuesta actualizada con una implementación de método auxiliar que puede resultarle útil. – lambdas

+1

He propuesto una extensión para el marco de juego, para programar un enfoque más codificado sobre los parámetros predeterminados. Ver https://github.com/playframework/Play20/pull/381 – natbusa

12

de Juego 2,1

 
val p = Form(
    mapping(
     "top" -> default(number,42) 
    )(CData.apply)(CData.unapply) 
).bindFromRequest() 

va a hacer lo que quiere.

Cuestiones relacionadas