我可以告诉您,通过带有复选框的 javascript 将删除全部处理为单独的销毁调用会更干净。这是我所做的(使用prototype.js):
function delete_selected () {
var table_id;
$$('table.data tr td.selector "]').each(function(e) {
table_id = e.up('table').id;
var id = e.up('tr').id;
var destroy_link = e.up('tr').down('td#destroy a');
var method = 'delete', url = destroy_link.readAttribute('href');
var csrf_param = $$('meta[name=csrf-param]')[0], csrf_token = $$('meta[name=csrf-token]')[0];
var params = {};
params[csrf_param.readAttribute('content').toString()] = csrf_token.readAttribute('content');
if (csrf_param) {
new Ajax.Request(url, {
'method': method,
'parameters': params,
onSuccess: function (transport) {
highlight_row(e.up('tr'), 'deleted');
},
asynchronous: true
});
}
});
这里是必要的 ruby 代码和一个数据表示例(与默认非常相似):
<%= csrf_meta_tag %>
<a href="#" onclick="delete_selected();">delete selected</a>
<table id="categories" class="data">
<thead>
<tr>
<th class="selector"><input id="all" type="checkbox" /></th>
<th id="id" class="value">Id</th>
<th id="name" class="value">Name</th>
<th id="show" class="action"></th>
<th id="edit" class="action"></th>
<th id="destroy" class="action"></th>
</tr>
</thead>
<tbody>
<% @categories.each do |category| %>
<tr id="<%= category.id %>">
<td class="selector"><input type="checkbox" /></td>
<td id="id" class="value"><%= category.id %></td>
<td id="name" class="value"><%= category.name %></td>
<td id="show" class="action"><%= link_to 'Show', category %></td>
<td id="edit" class="action"><%= link_to 'Edit', edit_category_path(category) %></td>
<td id="destroy" class="action"><%= link_to 'Destroy', category, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
</tbody>
</table>
您可以忽略 highlight_row。它只是一个辅助函数,用于突出显示并从表中删除已删除的对象(无需重新加载页面)。我把它留在那里,以便您了解如何管理回调。
无论如何,我知道这不是一个纯粹的 ruby 修复程序,但正如您所见,将它从 delete_selected 转换为 delete_all 只需要很少的努力。干杯。