>我有一个用于更新"点"模型的远程表单。这是一个非常普通的表单,带有提交按钮。
但是,我还想在"更新"按钮旁边包含一个"删除"按钮。
不幸的是,这有一个问题。当我单击"更新"按钮时,它最终会删除该条目 - 删除链接似乎劫持了更新表单。
编辑:我想我知道为什么更新按钮被删除。当我将删除链接添加到表单时,它会添加以下输入:
<input name="_method" type="hidden" value="delete">
无论我按哪个按钮,这个"_method"参数都会被拾取!
现在,我知道我可以将删除按钮与表单元素放在一起,但在这种情况下,我不允许这样做。
我想删除按钮可能只是另一个更新提交按钮,但带有额外的 :remove_this 参数。
但是,有些事情感觉不对劲。有什么想法吗?
另一个不需要javascript的奇怪解决方法是将删除表单放在更新表单之外,但在更新表单中留下<标签>="theSubmitButtonInTheDeleteForm">。更新表单将继续按预期工作,但单击标签将提交删除表单。然后只需将标签样式设置为按钮即可。标签>
我建议使用链接而不是按钮,并将其样式设置为按钮:
link_to("Remove", resource_url, method: :delete, class: "delete_button")
在 Rails 3 中,使用 Ajax 提交表单的推荐方法是将form_for
与 UJS
结合使用,而不是remote_form_for
。请看这个轨道广播剧集了解更多信息。
然后,当文档准备就绪/加载时,向每个按钮添加一个单击侦听器,并采取相应的操作:
$('#id_of_delete_button').click(function() {
// serialize the form and submit it to the delete action
});
$('#id_of_update_button').click(function() {
// serialize the form and submit it to the update action
});
给定的代码片段在jQuery中,但你也可以以类似的方式使用Prototype。
基本上,"更新表单"和"删除表单"之间的唯一区别是存在<input name="_method" type="hidden" value="delete">
所以这是我想出的解决方法:
<%= form.submit 'Update', :id => "point_#{point.id}_submit", :style => "" %>
<%= form.submit 'Remove', :confirm => 'Are you sure?', :id => "point_#{point.id}_remove" %>
remove_button.observe('click', function(event)
{
form_element.insert('<input name="_method" type="hidden" value="delete">');
}
= f.button :submit, class: "btn-primary"
= link_to "Delete", f.object, class: 'btn btn-default', data: {method: 'DELETE'}
删除链接的样式与引导程序一起看起来像一个按钮。 jquery-ujs
劫持具有data-method
属性的链接点击,并使用自定义HTTP方法发送它们。
这样做:
<%= button_to 'Delete', point_path(point), :method => 'delete', :confirm => 'Are you sure?' %>
你会做一个link_to 'del', 变量, :confirm => '你确定吗?', :method => :d elete
:method => :d elete 将调用控制器的销毁部分。