2010-03-02 3 views
13

Comment définir un ID personnalisé lors de l'utilisation d'une aide check_box_tag dans les rails?Utiliser un ID personnalisé pour check_box_tag dans Rails

J'ai une boucle qui crée un groupe de cases à cocher sur la base d'une collection:

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

Je voudrais définir un identifiant personnalisé de sorte que mon étiquette pour la case à cocher fonctionne correctement mais je ne peux pas sembler comprendre comment (: id => sr.id ne fonctionne pas ...).

Le problème pourrait aussi être la façon dont je l'ai défini l'étiquette, donc si je peux obtenir que faire référence à la case à cocher correcte sans définir un identifiant personnalisé alors ce serait bien aussi ...

+0

Vous devriez revenir et accepter la réponse à cette question: 3 – Kevin

Répondre

16

J'ai utilisé dans mon application pour créer des étiquettes de cases à cocher de la collection et de présenter un tableau d'entre eux:

<% @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 %> 

Donc params, j'ai un tableau "curso_ids" => [ "1", " 3 "," 5 "] au lieu d'une chaîne " curso_ids "=>" 5 ". Si vous voulez renvoyer une seule valeur, utilisez vaga [curso_id], sinon utilisez vaga [curso_ids] [] pour retourner un tableau.

+1

Vous venez m'a aidé à nettoyer un code horrible. Merci! – crftr

+0

Un point mineur: vous pouvez supprimer les mots 'true if' de la quatrième ligne, car la valeur de l'expression qui les suit est soit' true', soit 'false', de toute façon. –

3

Think Je l'ai compris ...

- 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 

Cela fonctionne mais si vous avez un meilleur moyen faites le moi savoir!

11

@Ganesh, dans votre solution le hachage params résultant a la forme suivante:

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

Ceux-ci devraient travailler mieux pour vous:

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

Notez que le troisième paramètre (vérifié) est nécessaire pour ceci pour fonctionner. Le tableau params qui en résulte sera

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

qui ressemble à une meilleure façon, merci! –

1

Ceci a été très utile et a mis fin à ma recherche de plusieurs jours. La plupart de ce que j'avais trouvé jusqu'à présent contenait de la syntaxe et des paramètres supplémentaires qui sont soit marqués, soit ignorés complètement. Tout ce que je veux faire est de passer un tableau de ma vue à mon contrôleur et d'utiliser des cases à cocher pour dire au contrôleur quels éléments du tableau à traiter. Je suis en mesure de réduire ce qui précède encore plus loin, à:

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

où c vient de ma base de données:

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

Bien sûr, passe un tableau de ids d'objet à mon contrôleur se rapportant uniquement à la vérification entrées (les entrées sont décochées par défaut puisque j'ai omis le : faux paramètre, qui produit d'ailleurs le même résultat que : vrai), ce qui est presque tout ce dont j'ai besoin. Maintenant j'ai juste besoin de passer dans un indicateur de type d'objet - même juste une chaîne littérale fera bien - de sorte que le contrôleur sache quel type d'objet il doit traiter sans avoir à augmenter mon modèle avec une colonne supplémentaire.Je vais commencer maintenant et poster ma solution mais s'il vous plaît laissez-moi savoir s'il y a un moyen rapide et facile de le faire si vous le savez déjà.

0

Leito,

Juste pour fermer la boucle, je renonçai de passer un indicateur de type d'objet à travers check_box_tag. Chaque paramètre ajouté à la syntaxe indiquée dans mon dernier message ci-dessus (ci-dessous ??) a simplement fait que l'état de la case à cocher soit coché au lieu de non coché, sans transmettre de données supplémentaires au contrôleur.

Tout en restant attentifs aux solutions alternatives telles qu'elles se présentent, j'incorpore pour le moment le type d'objet dans la valeur submit_tag. Ceci lie la fonctionnalité à l'affichage, puisque la valeur submit_tag est ce qui est montré à l'utilisateur sur le bouton de soumission, mais on pourrait argumenter que cela force la clarté dans la vue même si cela fournit une désambiguïsation nécessaire au contrôleur.

jour d'apprentissage par jour ...

14

Si vous donnez la case à cocher un paramètre supplémentaire, il fonctionnera:

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

travaillé pour moi, quelle magie c'est? –

+1

@arivarasan La définition de la fonction est 'check_box_tag (nom, valeur =" 1 ", checked = false, options = {})', donc 'nil' est un espace réservé pour l'argument' checked'; 'true' ou' false' fonctionnerait aussi, selon votre préférence. – vol7ron

Questions connexes