2013-09-27 7 views
7

Perché simple_form genera tag di input due volte per i campi booleani (uno nascosto e l'altro no)?Simple_form: perché vengono generati due tag di input al posto di uno?

Nel mio simple_form, ho questo:

<%= form.input :over_phone, as: :boolean, input_html: {checked: true} %>

che genera questo:

<div class="control-group boolean optional order_over_phone"> 
    <label class="boolean optional control-label" for="order_over_phone">Order over phone</label> 
    <div class="controls"> 
    <input name="order[over_phone]" type="hidden" value="0"> 
    <label class="checkbox"> 
     <input checked="checked" class="boolean optional" id="order_over_phone" name="order[over_phone]" type="checkbox" value="1"> 
    </label> 
    </div> 
</div> 

Come si può vedere, un tag input è nascosta con un valore pari a 0 e l'altra è unhidden con un valore di 1. Se ho inviato il modulo, nei parametri di post-ottengo entrambi i valori:

order[over_phone]:0 
order[over_phone]:1 

Ho un comportamento casuale nella creazione del modello associato a questo campo booleano, quindi mi chiedo se sia causato da simple_form. Questo non succede con i tipi di campi non booleani.

Se hai riscontrato un problema simile, condividi la tua esperienza.

Sto usando simple_form 2.1.0.

risposta

8

check_box Gotcha specifica

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box

Il codice HTML dice caselle di controllo non controllati non hanno successo, e quindi i browser web non li invia. Sfortunatamente questo introduce un trucco: se un modello di fattura ha un contrassegno pagato e nel modulo che modifica una fattura a pagamento l'utente deseleziona la relativa casella di controllo, non viene inviato alcun parametro pagato. Quindi, qualsiasi idioma di assegnazione di massa come

@invoice.update(params[:invoice]) 

non aggiorna il flag.

Per impedire che l'helper generi un campo nascosto ausiliario prima della casella di controllo. Il campo nascosto ha lo stesso nome e i relativi attributi simulano una casella di controllo deselezionata.

In questo modo, il client invia solo il campo nascosto (che indica che la casella di controllo è deselezionata) o entrambi i campi. Poiché le specifiche HTML indicano che le coppie chiave/valore devono essere inviate nello stesso ordine in cui appaiono nel modulo, e l'estrazione dei parametri ottiene l'ultima occorrenza di qualsiasi chiave ripetuta nella stringa di query, che funziona per i moduli ordinari.

+0

Grazie mille! Questo lo spiega. Ho appena capito, il mio problema con il campo "over_phone" era altrove. – Nurbo