使用一个表单内的不同按钮对选定的页面元素执行不同的操作

前段时间我问过如何选择多个页面元素并对它们执行操作 。

我实现了它,效果很好。 现在我面临另一个问题: 如何为这些元素进行多项操作?

我的观点现在看起来像这样:

  ...    

所以我有复选框和名为“删除已选中”的提交按钮。 我希望旁边有另一个按钮 – “移动到另一张专辑”。

我的控制器将使用:update方法而不是:delete所以我假设form_for ... method: :delete不是我在这里可以使用的。

实际上,根据点击的按钮(或按下回车键)更改表单操作的最简单方法是这样的:

 

您目前有一个发布到destroy操作的表单按钮。 您正在将表单数据(包含(其中包括已检查模型的ID)的参数提交给destroy操作,该操作可以通过表单收集和提交的数据执行您想要的任何操作。 您所要求的将需要另一个按钮(或提交表单的某种方式)指向另一个操作(在您的情况下,看起来您想要使用update ),但您不能直接执行此操作,因为表单决定采取何种操作使用,而不是按钮。 那你该怎么办?

你真正想要的是什么:

答案是将表单发布到您选择的操作(可能是您创建的自定义操作,因为在您的情况下,将其称为destroyupdate没有意义的)。

怎么做:

为了简单起见,只需更改表单以使用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); }); });