如何在多记录Rails表单中为复选框设置唯一ID?

时间:2009-06-14 03:38:52

标签: ruby-on-rails ajax forms checkbox multiple-records

我大致按照this Railscast中的说明设置了Rails表单。

以下是表单的代码:

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

这是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>

它运行良好,但我希望开始实现AJAX,我需要每个复选框都有一个唯一的ID。现在,生成的输入标签看起来像这样:

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

每个复选框都有相同的ID(“todo_ids_”),这是一个问题。我怀疑解决方案很简单,但我没有看到它。有什么提示吗?

4 个答案:

答案 0 :(得分:7)

<%= check_box_tag "todo_ids[]", todo.id, false, :id => "todo_id_#{todo.id}" -%>或任何你想要的id。

我认为这是check_box_tag的一个错误,这个错误是由于手动赋予它名称为todo_ids []和调用sanitize_to_id(name)的方法代码这看似非常虚伪的特性造成的。我昨天碰到了这个,我正在考虑补丁。

答案 1 :(得分:2)

我最终使用了类似于Ryan的解决方案,但正如我在评论中写的那样,我不得不做出进一步的改变。形式如下:

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

在表单调用的操作中:

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

最后请注意“params [:todo_ids] .keys”,这是一种解决参数格式奇怪方式的解决方法:

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

答案 2 :(得分:1)

你可以尝试一下,让我们知道它是否有效:

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

答案 3 :(得分:1)

这是check_box_tag的预期行为,this comment on a rejected fix explains

您可以像这样使用collection_check_boxes haml 语法,抱歉):

# 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

当然你可以在块里面使用partials,只需传递并使用里面的构建器。

检查API docs

中的更多选项