如何为多记录 Rails 表单中的复选框设置唯一 ID?
Posted
技术标签:
【中文标题】如何为多记录 Rails 表单中的复选框设置唯一 ID?【英文标题】:How do I set a unique ID for checkboxes in a multi-record Rails form? 【发布时间】:2010-11-02 18:54:47 【问题描述】:我已经大致按照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 部分的代码:
<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_"),这是一个问题。我怀疑解决方案非常简单,但我没有看到。有什么建议吗?
【问题讨论】:
【参考方案1】:<%= check_box_tag "todo_ids[]", todo.id, false, :id => "todo_id_#todo.id" -%>
或任何你想要的 id。
我认为这是 check_box_tag 的一个错误,原因是手动将其命名为 todo_ids[] 和调用 sanitize_to_id(name) 的方法代码的看似骇人听闻的性质。我昨天刚遇到这个,我正在考虑一个补丁。
【讨论】:
这似乎无法正常工作。我最终得到如下输入标签: 表单仍然有效,但每个输入都是默认勾选。 为此,您需要在散列参数之前提供选中的参数。当调用 check_box_tag("todo_ids[]", todo.id, false, :id => "todo_id_#todo.id") 你会得到: 【参考方案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"
【讨论】:
【参考方案3】:你可以试试这个,让我们知道它是否有效:
check_box_tag "todo_ids[#todo.id]", todo.id %>
【讨论】:
生成以下内容: id 都是唯一的,这很好,但是它以一种奇怪的方式发送参数: todo_ids"=>"5"=>"5" 我最终使用: Todo.update_all(["completed_at = ?", Time.now], :id => params[ :todo_ids].keys) 作为一种解决方法,并且效果很好(尽管它看起来像是一种混乱的解决方案)。谢谢! 你应该使用 params[:todo_ids].keys.collect(&:to_i)。很高兴你成功了。【参考方案4】:这是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,只需传递并使用里面的builder。
查看API docs中的更多选项。
【讨论】:
以上是关于如何为多记录 Rails 表单中的复选框设置唯一 ID?的主要内容,如果未能解决你的问题,请参考以下文章