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

时间:2014-04-17 19:14:44

标签: ruby-on-rails

前段时间我问过如何select multiple page elements and perform an action on them

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

我的观点看起来就是这样:

<%= form_for :album_slides_multi, method: :delete, id: 'multi-select' do |f| %>
<%= f.submit "Delete selected" %>
...
<% @slides.each do |slide| %>
<tr>
      <td><%= check_box_tag "ids[]", slide.id, false, class: "multi-delete" %></td>

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

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

3 个答案:

答案 0 :(得分:1)

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

你真正想要的是什么:

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

怎么做:

为简单起见,只需更改表单即可使用update操作而不是destroy操作(因为它更有意义)

<%= form_for :album_slides_multi, method: :update, id: 'multi-select' do |f| %>

单独保留提交/删除按钮:

<%= f.submit "Delete selected" %>

为您的“另一张专辑”添加新标签。功能按钮:

<%= f.submit "Move selected" %>

以上标签为您提供了如下所示的html:

<input type="submit" value="Delete selected" name="commit" />
<input type="submit" value="Move selected" name="commit" />

然后,在您的控制器中,让您的更新操作如下所示:

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"部分,因为该按钮的值为&#34;移动已选择&# 34;并且该值与其他参数一起提交,名称为#34; commit&#34;。

如果它更有意义,请随意创建一个名为update更合适的新动作。我不知道如何在这里详细说明如何做到这一点,因为有很多资源解释如何做到这一点,但使用上面的更新操作来完成你想要的东西应该教你学习的东西。

这称为多按钮形式,并在Rails Cast #38中介绍,但该剧集是从2007年开始的,确切的语法可能会在某些地方显示日期。

答案 1 :(得分:1)

如果您有两个表单,并且希望第一个中的复选框操作在第二个表单中进行镜像,则可以执行以下操作:

<强> Fiddle

$(document).ready(function(){
    $('#foo_form input:checkbox').change(function(){
       $('#bar_' + this.id.replace('foo_', '')).prop('checked', this.checked); 
    });
});

答案 2 :(得分:1)

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

<form id="form" action="form_1" method="post">
<button data-action="form_2">button1</button>
<button data-action="form_3">button2</button>
<button data-action="form_4">button3</button>
</form>


<script>
$(document).ready(function(e) { 
$('button').click(function(e) {
    $('#form').attr('action',$(this).attr('data-action'));
});
});
</script>