2

我大致按照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_"),这是一个问题。我怀疑解决方案非常简单,但我没有看到。有小费吗?

4

4 回答 4

7

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

我认为这是一个带有 check_box_tag 的错误,原因是手动将其命名为 todo_ids[] 和调用 sanitize_to_id(name) 的方法代码的看似骇人听闻的性质。我昨天刚遇到这个,我正在考虑一个补丁。

于 2009-06-14T03:48:25.207 回答
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"}
于 2009-06-14T05:37:13.027 回答
1

你可以试试这个,让我们知道它是否有效:

check_box_tag "todo_ids[#{todo.id}]", todo.id %>
于 2009-06-14T03:47:06.960 回答
1

这是预期的行为check_box_tag,正如对被拒绝修复的评论所解释的那样。

您可以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

当然,您可以在块内使用部分,只需传递并使用内部的构建器。

检查API 文档中的更多选项。

于 2016-09-18T10:30:21.347 回答