2010-03-02 9 views
13

Come si imposta un ID personalizzato quando si utilizza un helper check_box_tag nelle guide?Usa ID personalizzato per check_box_tag in Rails

Ho un ciclo che crea un gruppo di caselle di controllo basati su una collezione:

- subject.syllabus_references.each do |sr| 
     = check_box_tag 'question[syllabus_reference]', sr.id, :id => sr.id 
     = label_tag sr.id, sr.name 

vorrei impostare un ID personalizzato in modo che la mia etichetta per la casella di controllo funziona correttamente, ma io non riesco a capire come (: id => sr.id non funziona ...).

Il problema potrebbe anche essere con il modo in cui ho definito l'etichetta, quindi se posso ottenere che per fare riferimento la casella di controllo corretto senza impostare un ID personalizzato allora che sarebbe bene anche ...

+0

Si dovrebbe tornare indietro e accettare la risposta a questa domanda: 3 – Kevin

risposta

16

Ho usato questo nella mia applicazione per creare tag checkbox dalla raccolta e presentare una serie di loro:

<% @cursos.each do |c| %> 
    <span class='select_curso'> 
    <%= check_box_tag "vaga[curso_ids][]", 
     c.id, (checked = true if form.object.curso_ids.include?(c.id)) %> 
    <%= label_tag "vaga[curso_ids][][#{c.id}]", c.nome %> 
    </span> 
<% end %> 

Quindi, in params, ho una serie "curso_ids" => [ "1", " 3 "," 5 "] anziché una stringa " curso_ids "=>" 5 ". Se si desidera restituire un valore singolo, utilizzare vaga [curso_id], altrimenti utilizzare vaga [curso_ids] [] per restituire un array.

+1

Basta mi ha aiutato a ripulire qualche brutto codice. Grazie! – crftr

+0

Un punto secondario: puoi rimuovere le parole 'true if' dalla quarta riga, perché il valore dell'espressione che le segue è o 'true' o' false', comunque. –

3

Pensate Ho capito ...

- subject.syllabus_references.each do |sr| 
    = check_box_tag "question[syllabus_reference][#{sr.id}]", sr.id 
    = label_tag "question[syllabus_reference][#{sr.id}]", sr.name 

Questo funziona, ma se avete un modo migliore fammi sapere!

11

@Ganesh, nella soluzione del params hash risultante ha la seguente forma:

params[:question][:syllabus_reference] = {1 => 1, 2 => 2, 3 => 3, ...} 

questi dovrebbero lavorare meglio per voi:

check_box_tag "question[syllabus_reference][]", sr.id, checked, {:id => "question_syllabus_reference_#{sr.id}" 

Avviso è richiesto il terzo parametro (controllato) per questo per funzionare. L'array params risultante sarà

params[:question][:syllabus_reference] = {1, 2, 3, ...} 
+0

che sembra un modo migliore, grazie! –

1

Questo è stato molto utile e ha portato la mia ricerca lunga un giorno alla fine. La maggior parte di ciò che ho trovato fino ad ora conteneva la sintassi e parametri extra che rotaevano o sono stati segnalati o ignorati del tutto. Tutto quello che voglio fare è passare un array dalla mia vista al mio controller e usare le checkbox per dire al controller quali elementi dell'array elaborare. Sono stato in grado di ridurre il sopra ancora di più, a:

<%= check_box_tag "c[]", c.id %> 

dove c viene dal mio database:

<%= @objects.each do |c| %> 

Questo, naturalmente, passa una matrice di ID di oggetto per il mio controller appartenenti solo alla controllata voci (voci sono deselezionata per impostazione predefinita quando ho lasciato la : parametro di falsa, che tra l'altro produce lo stesso risultato di : true), che è quasi tutto quello che ho bisogno.

Ora ho solo bisogno di passare un indicatore di tipo di oggetto - anche solo una stringa letterale funzionerà bene - in modo che il controller sappia quale tipo di oggetto debba essere elaborato senza dover aumentare il mio modello con una colonna in più.Inizierò da ora e pubblicheremo la mia soluzione, ma per favore fatemi sapere se c'è un modo semplice e veloce per farlo, se già lo sapete.

0

Leito,

Proprio per chiudere il ciclo, ho rinunciato a passare un indicatore del tipo di oggetto attraverso check_box_tag. Ogni parametro aggiunto alla sintassi mostrata nel mio ultimo post sopra (sotto ??) ha semplicemente portato lo stato della casella di controllo a predefinito a anziché a non selezionato, senza passare alcun dato aggiuntivo al controller.

Pur rimanendo allerta per soluzioni alternative mentre si presentano, per il momento incorporare il tipo di oggetto nel valore submit_tag. Ciò lega la funzionalità al display, dal momento che il valore submit_tag è ciò che viene mostrato all'utente sul pulsante di invio, ma si potrebbe sostenere che questo impone chiarezza nella vista anche se fornisce la necessaria disambiguazione al controller.

Apprendimento di giorno in giorno ...

14

Se si dà la casella di controllo un parametro aggiuntivo che funzionerà:

= check_box_tag 'question[syllabus_reference]', 1, nil, :id => sr.id 
+1

ha funzionato per me, che magia è? –

+1

@arivarasan La definizione della funzione è 'check_box_tag (name, value =" 1 ", checked = false, options = {})', quindi 'nil' è un segnaposto per l'argomento' checked'; 'true' o' false' funzionano anche, a seconda delle preferenze. – vol7ron

Problemi correlati