How do I set a unique ID for checkboxes in a multi-record Rails form?

旧时模样 提交于 2019-12-30 07:27:28

问题


I've set up a Rails form roughly following the instructions in this Railscast.

Here's the code for the form:

<% form_tag complete_todos_path, :method => :put do %>
    <ul>
    <div id="incomplete_todos">
    <% @incomplete_todos.each do |todo| %>
        <%= render :partial => todo %>
    <% end %>
    </div>
    </ul>
    <%= submit_tag "Mark as completed" %>
<% end %>

And here's the code for the todo partial:

<div class="todo">
    <li>
        <%= check_box_tag "todo_ids[]", todo.id %>
        <%=h todo.name %>
        <%= link_to 'edit', edit_todo_path(todo) %>
        <%= link_to 'delete', todo, :confirm => 'Are you sure?', :method => :delete %>
    </li>
</div>

It's working great, but I'm looking to start implementing AJAX and I need each checkbox to have a unique id. Right now, the input tags generated look something like this:

<input id="todo_ids_" name="todo_ids[]" type="checkbox" value="7" />

Every check box has the same id ("todo_ids_"), which is a problem. I suspect the solution is embarrassingly simple, but I'm not seeing it. Any tips?


回答1:


<%= check_box_tag "todo_ids[]", todo.id, false, :id => "todo_id_#{todo.id}" -%> or whatever you want the id to be.

I consider this a bug with check_box_tag caused by the seemingly hackish nature of manually giving it the name todo_ids[] and the method code calling sanitize_to_id(name). I just ran into this yesterday and I'm contemplating a patch.




回答2:


I ended up using a solution similar to Ryan's, but as I wrote in the comment I had to make a further change. In the form:

<%= check_box_tag "todo_ids[#{todo.id}]", todo.id %>

In the action called by the form:

Todo.update_all(["completed_at = ?", Time.now], :id => params[:todo_ids].keys)

Note the "params[:todo_ids].keys" at the end, which was a workaround to deal with the odd way the parameters were formatted:

"todo_ids" => {"5"=>"5"}



回答3:


Can you try this and let us know if it works:

check_box_tag "todo_ids[#{todo.id}]", todo.id %>



回答4:


This is the expected behaviour of check_box_tag, as this comment on a rejected fix explains.

You can use collection_check_boxes like this (haml syntax, sorry):

# Accumulate todos in a params hash like { todos: { to_complete: [] } }
= collection_check_boxes(:todos, :to_complete, @incomplete_todos, :id, :name) do |todo_builder|
  = todo_builder.label do
    # This is the result of calling :name on the todo, as specified
    # calling the helper
    = todo_builder.text
    = todo_builder.check_box

Of course you can use partials inside the block, just pass and use the builder inside.

Check more options in the API docs.



来源:https://stackoverflow.com/questions/992094/how-do-i-set-a-unique-id-for-checkboxes-in-a-multi-record-rails-form

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!