如何为多记录 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】:

&lt;%= check_box_tag "todo_ids[]", todo.id, false, :id =&gt; "todo_id_#todo.id" -%&gt; 或任何你想要的 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_boxeshaml语法,抱歉):

# 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Rails 中的 url 助手设置默认主机?

Rails:如何为 Rails activerecord 模型中的属性创建默认值? [复制]

如何为 BigQuery 表中的记录生成唯一键值?

如何为一组复选框使用 required 属性? [复制]

如何为嵌套在数组中的文档中的字段设置唯一约束?

如何为我的 React 表单组件中的选择菜单设置默认值?