2011-05-12 9 views
5

Tengo un objeto Usuario que tiene muchos atributos. En mi pantalla de perfil de edición, estoy mostrando un subconjunto de esos atributos. En la acción del controlador correspondiente, ¿cómo puedo validar solo los campos que se están editando y no todos los campos en el objeto Usuario?Marco de juego: ¿Cómo validar un subconjunto de campos en un objeto?

He anotado los campos en el objeto Usuario con las restricciones MaxSize, Email, URL, etc. y no quiero repetirlos nuevamente al validar cada campo manualmente.

Cualquier puntero sería muy apreciado. ¡Gracias!

Respuesta

0

la manera más simple es pasar el objeto completo al método de recepción y simplemente validar todo. Como solo está editando un subconjunto de campos, serán los únicos que cambiarán y los que generarán un error si la validación falla. Esto es, por supuesto, ¡suponiendo que nunca almacene objetos no válidos en la base de datos!

De lo contrario, también puede crear un bean de soporte que no se extienda desde Model, con etiquetas de validación, y pasarlo al formulario y al controlador. Algo así como:

public class SupportBean { 
    @Email 
    public String mail; 
    @Max(3) 
    public int size; 
    //etc, add getters and setters as I'm not sure if it is required. 
} 

En ambos casos, sería algo como esto, en sustitución del objeto de usuario completa por un objeto temporal si es necesario (vuelva a revisar el código, no tengo Juego ambiente aquí y puede hacer algunas errores tipográficos/errores pequeños)

*{ assuming parameter 'user' is passed in the render method that creates this view }* 
#{form @controller.save()} 
    #{field 'user.name'} 
    <p> 
     <label>&{field.name}</label> 
     <input type="text" id="${field.id}" name="${field.name}" value="${field.value}" class="${field.errorClass}"> 
     <span class="error">${field.error}</span> 
    </p> 
    #{/field} 
    *{ add more field the same way }* 
#{/form} 

y luego en el controlador:

*{ we tag required for validation }* 
public static void save(@Valid User user) { 
    checkAuthenticity(); 
    if(validation.hasErrors()){ 
    //there are errors, add to flash and redirect to edit page 
    } else { 
    user.save(); 
    //redirect 
    } 
} 

añadir una regla POST para 'salvar' int archivo que él rutas, y ya está listo para ir.

El marco tiene un proyecto de muestra (validación Creo que es el nombre) que contiene 7 formas diferentes de hacer la validación. El último usa JQuery para reutilizar las etiquetas de validación de su clase y ejecutar la misma validación en el cliente antes de comprometerse. Echales un vistazo, pueden ayudarte mucho :)

+1

Hola Pete, gracias por tu respuesta. Miré los ejemplos, pero estaba tratando de evitar crear clases adicionales y repetir las reglas de validación. El marco de OVal que Play usa internamente para la validación admite algo llamado perfiles de restricciones, que le permite especificar qué reglas activar bajo qué condiciones; sin embargo, Play parece no estar de acuerdo todavía (¡creo!). http://oval.sourceforge.net/userguide.html#d4e561 Tengo que profundizar más y ver si se puede hacer algo a lo largo de esas líneas, ya que puedo ver que es realmente útil en estos escenarios. ¡Gracias de nuevo! – Sen

Cuestiones relacionadas