2010-05-30 19 views
6

Ho problemi con la proprietà booleana di associazione nelle classi di associazione. La proprietà è impostata su true se spunta la casella di controllo (buona), ma è null se la casella di controllo non è selezionata.casella di controllo Grails

Conosco il problema con la casella di controllo HTML. So perché viene inviato "_fieldName" in params, ma questo "_fieldName" non imposta la proprietà booleana su false 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> 

Se controllo casella di controllo:
[isHidden: il, titolo: una, _isHidden:]
person.groups println [0] // vero

Se assegno casella I don:
[titolo: a, _isHidden:]
person.groups println [0] // nullo



Grazie mille per l'aiuto
Tom
Mi dispiace, ho cercato su questo sito, ma non ho ricevuto informazioni reali per il mio problema.

+0

Alcuni codici GSP potrebbero essere utili qui. –

+0

Ciao Scott, aggiungo il codice GSP. Grazie Tom –

+0

Questo errore non è stato corretto sul repository github di Grails: https://github.com/grails/grails-core/blob/master/grails-plugin-gsp/src/main/groovy/org/codehaus/ groovy/grails/plugins/web/taglib/FormTagLib.groovy questo mi stava facendo impazzire !! –

risposta

5

correggo tag casella di controllo. Grazie all'aiuto del gid, ora funziona anche con l'associazione.

dalla fonte:
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

roba buona .. vedrò se riesco a creare un test e patch per il progetto grails –

+0

roba carina, grazie mille – Thermech

+0

Grazie questo aiuta molto, non posso credere che non hanno ancora risolto questo problema. Ho dovuto modificare un po 'la fonte. Ma l'idea generale funziona. È necessario aggiornare il nome del campo nascosto. – Nix

5

Dopo molte violazione al sistema appare la risposta è che graal è alla ricerca di un campo indicatore con il nome:

groups[0]._isHidden 

piuttosto che

_groups[0].isHidden 

che è in realtà ciò che il tag g:checkBox genera. Vedi GrailsDataBinder.java:911 vedere propertyStartsWithFieldMarkerPrefix (PropertyValue pv, String fieldMarkerPrefix) per la conferma

Se siete interessati Ho caricato il progetto di test per questa domanda per gitub.com

+0

Grazie mille. Tom –

0

Impostare il valore di default la casella "false", e dovrebbe risolvere il problema. Spero che aiuti.

Problemi correlati