2010-05-30 30 views
6

Tengo problemas para vincular la propiedad booleana en las clases de asociación. La propiedad está configurada en true si marcó la casilla de verificación (buena), pero es nula si checbox no está marcada.Casilla de verificación Grails

Conozco el problema con la casilla de verificación HTML. Sé por qué se envía "_fieldName" en params, pero este "_fieldName" no establece mi propiedad booleana en false.

class Person{ 
    String title 

    List<Group> groups = new ArrayList() 
    static hasMany = [groups: Groups]  
} 

class Group{ 
    String title 
    Boolean isHidden 

    static belongTo = Person 
} 

class PersonController{ 

    def form = { 
     def person = new Person() 
     person.groups.add(new Group())  
     return ["person": person] 
    } 

    def handleForm = { 
     def person = new Person(params) 
     println person.groups[0] 
    } 
} 


<g:form action="save"> 
    <g:textField name="title" value="${person?.title}" /> 
    <g:textField name="groups[0].title" value="${person?.groups[0]?.title}"/> 
    <g:checkBox name="groups[0].isHidden" value="${person?.groups[0]?.isHidden}" /> 
    <g:submitButton name="save" value="Save" /> 
    </g:form> 

Si puedo comprobar casilla:
[isHidden: sobre, título: una, _isHidden:]
person.groups println [0] // verdadera

Si yo no marque la casilla:
[título: a, _isHidden:]
person.groups println [0] // nula



Muchas gracias por la ayuda
Tom
Lo siento, busqué en esta web, pero no recibí la información real de mi problema.

+0

Algunos códigos GSP pueden ser útiles aquí. –

+0

Hola Scott, añado el código GSP. Gracias Tom –

+0

Este error no ha sido parcheado en el Repos de Github Grails: https://github.com/grails/grails-core/blob/master/grails-plugin-gsp/src/main/groovy/org/codehaus/ groovy/grails/plugins/web/taglib/FormTagLib.groovy ¡Esto me estaba volviendo loco! –

Respuesta

5

en lo correcto etiqueta de casilla de verificación. Gracias a la ayuda de gid, ahora también funciona con asociación.

de la fuente:
http://grails.org/doc/latest/ref/Tags/checkBox.html#

if (value == null) value = false 

out << "<input type=\"hidden\" name=\"_${name}\" /><input type=\"checkbox\" name=\"${name}\" " 

if (value && checked) { out << 'checked="checked" ' } 

a:

if (value == null) value = false 

def begin = name.lastIndexOf('.') +1 
def tail = name.substring(begin); 
out << "<input type=\"hidden\" name=\"${name.replace( tail, "_" + tail )}\" /><input type=\"checkbox\" name=\"${name}\" " 

if (value && checked) { out << 'checked="checked" ' } 
+0

cosas buenas ... Veré si puedo crear una prueba y un parche para el proyecto de grails –

+0

Cosas agradables, muchas gracias – Thermech

+0

Gracias esto ayuda mucho, no puedo creer que aún no hayan solucionado esto. Tuve que modificar un poco la fuente. Pero la idea general funciona. Necesita actualizar el nombre del campo oculto. – Nix

5

Después de mucha piratería parece que la respuesta es que griales está buscando un campo de marcador con el nombre:

groups[0]._isHidden 

en lugar de

_groups[0].isHidden 

que en realidad es lo que genera la etiqueta g:checkBox. Ver GrailsDataBinder.java:911 ver propertyStartsWithFieldMarkerPrefix (pv PropertyValue, Cadena fieldMarkerPrefix) para la confirmación

Si está interesado He subido el proyecto de prueba para esta pregunta a gitub.com

+0

Muchas gracias. Tom –

0

Establecer el valor por defecto de la casilla de verificación de "falsa", y debe resolver el problema. Espero que ayude.

Cuestiones relacionadas