使用一个表单内的不同按钮对选定的页面元素执行不同的操作
前段时间我问过如何选择多个页面元素并对它们执行操作 。
我实现了它,效果很好。 现在我面临另一个问题: 如何为这些元素进行多项操作?
我的观点现在看起来像这样:
...
所以我有复选框和名为“删除已选中”的提交按钮。 我希望旁边有另一个按钮 – “移动到另一张专辑”。
我的控制器将使用:update
方法而不是:delete
所以我假设form_for ... method: :delete
不是我在这里可以使用的。
实际上,根据点击的按钮(或按下回车键)更改表单操作的最简单方法是这样的:
您目前有一个发布到destroy
操作的表单按钮。 您正在将表单数据(包含(其中包括已检查模型的ID)的参数提交给destroy
操作,该操作可以通过表单收集和提交的数据执行您想要的任何操作。 您所要求的将需要另一个按钮(或提交表单的某种方式)指向另一个操作(在您的情况下,看起来您想要使用update
),但您不能直接执行此操作,因为表单决定采取何种操作使用,而不是按钮。 那你该怎么办?
你真正想要的是什么:
答案是将表单发布到您选择的操作(可能是您创建的自定义操作,因为在您的情况下,将其称为destroy
或update
没有意义的)。
怎么做:
为了简单起见,只需更改表单以使用update
操作而不是destroy
操作(因为它更有意义)
<%= form_for :album_slides_multi, method: :update, id: 'multi-select' do |f| %>
单独保留提交/删除按钮:
<%= f.submit "Delete selected" %>
为“移动到另一个相册”function按钮添加新标签:
<%= f.submit "Move selected" %>
上面的标签给你看起来像这样的html:
然后,在您的控制器中,使您的更新操作读取如下内容:
def update if params[:commit] == "Delete selected" # your current delete logic elsif params[:commit] == "Move selected" # your desired move logic end
更多信息:
单击“ Move selected
按钮时,将触发update
操作,您将进入params[:commit] == "Move selected"
因为按钮的值为“Move selected”,并且该值已随之提交其余的params名为“commit”。
如果它更有意义,请随意创建一个名为比update
更合适的新动作。 我不会在这里详细说明如何做到这一点,因为有很多资源解释如何做到这一点,但使用上面的更新操作来完成你想要的东西应该教你学习什么。
这被称为多按钮forms,并在Rails Cast#38中有所介绍,但该剧集来自2007年,确切的语法可能会在某些地方过时。
如果您有两个表单,并且希望第一个中的复选框操作在第二个表单中进行镜像,则可以执行以下操作:
小提琴
$(document).ready(function(){ $('#foo_form input:checkbox').change(function(){ $('#bar_' + this.id.replace('foo_', '')).prop('checked', this.checked); }); });