【问题标题】:How do I set a unique ID for checkboxes in a multi-record Rails form?如何为多记录 Rails 表单中的复选框设置唯一 ID?
【发布时间】: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_"),这是一个问题。我怀疑解决方案非常简单,但我没有看到。有什么建议吗?

【问题讨论】:

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


    【解决方案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中的更多选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-02
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        • 2016-11-15
        • 1970-01-01
        • 1970-01-01
        • 2016-06-22
        相关资源
        最近更新 更多