我大致按照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_”),这是一个问题。我怀疑解决方案很简单,但我没有看到它。有什么提示吗?
答案 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。
中的更多选项