Use custom id for check_box_tag in Rails
Asked Answered
D

7

19

How do you set a custom id when using a check_box_tag helper in rails?

I have a loop which creates a bunch of checkboxes based on a collection:

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

I would like to set a custom id so that my Label for the checkbox works correctly but I can't seem to figure out how (:id => sr.id does not work...).

The problem might also be with the way I've defined the label, so if I can get that to reference the correct check box without setting a custom id then that would be fine also...

Destructionist answered 2/3, 2010 at 2:6 Comment(1)
You should come back and accept the answer to this question :3Denbrook
L
22

I used this in my application to create checkbox tags from collection and submit an array of them:

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

So in params, I have an array "curso_ids"=>["1", "3", "5"] instead of a string "curso_ids"=>"5". If you want to return a single value, use vaga[curso_id], otherwise use vaga[curso_ids][] to return an array.

Lipread answered 2/3, 2010 at 12:50 Comment(1)
A minor point: you can remove the words true if from the fourth row, because the value of the expression that follows them is either true or false, anyway.Carthy
T
22

If you give the check box an extra parameter it will work:

= check_box_tag 'question[syllabus_reference]', 1, nil, :id => sr.id
Theoretician answered 5/6, 2013 at 16:43 Comment(1)
@arivarasan The function definition is check_box_tag(name, value = "1", checked = false, options = {}) , so nil is a placeholder for the checked argument; true or false would also work, depending on your preference.Dorita
S
11

@Ganesh, in your solution the resulting params hash has the following form:

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

These should work better for you:

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

Notice the third parameter (checked) is required for this to work. The resulting params array will be

params[:question][:syllabus_reference] = {1, 2, 3, ...}
Stratfordonavon answered 1/6, 2011 at 19:8 Comment(0)
D
4

Think I figured it out...

- 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

This works but if you have a better way let me know!

Destructionist answered 2/3, 2010 at 2:31 Comment(0)
L
1

This was very helpful and brought my days-long search to an end. Most of what I'd found until now contained syntax and extra parameters which rails either flagged or ignored altogether. All I want to do is pass an array from my view to my controller and use checkboxes to tell the controller which array elements to process. I was able to reduce the above even further, to:

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

where c comes from my database:

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

This of course passes an array of object ids to my controller pertaining only to the checked entries (entries are unchecked by default since I left out the :false parameter, which by the way produces the same result as :true), which is almost all I need.

Now I just need to pass in an object type indicator - even just a literal string will do nicely - so that the controller knows what type of object it is to process without my having to augment my model with an extra column. I'll start in on that now and post my solution but please let me know if there's a quick and easy way to do this if you already know.

Librium answered 28/1, 2012 at 0:9 Comment(0)
P
1

HAML sample

Lets say you have a print object somewhere with a framed attribute, you have to display a list of prints so inside the loop you will create a custom row and column with unique id on each checkbox for updating framed

.input.row.collapse
  = check_box_tag :framed, print.framed, nil, { id: "framed_#{print.id}" }
Pas answered 9/7, 2018 at 21:21 Comment(0)
L
0

Leito,

Just to close the loop, I gave up trying to pass an object type indicator in through check_box_tag. Every parameter I added to the syntax shown in my last post above (below??) simply caused the checkbox state to default to checked rather than unchecked, without passing any additional data to the controller.

While remaining alert to alternative solutions as they present themselves, for the time being I incorporate the object type into the submit_tag value. This ties the functionality to the display, since the submit_tag value is what's shown to the user on the submit button, but it could be argued that this forces clarity into the view even as it provides needed disambiguation to the controller.

Learning day by day...

Librium answered 28/1, 2012 at 3:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.