关于ajax:在rails的单个表单上具有多个提交按钮的正确方法

Correct way to have multiple submit buttons on single form in rails

我的Rails应用程序中有一个页面,要求我在一个表单上有多个提交按钮。为了让您了解我要做什么,我有一个购物车,它是一个项目表。每个项目都有一个订购按钮和一个删除按钮。每个项目还有一个复选框,因此可以选择多个项目,然后通过表格底部的按钮提交订单。

当前,这三个按钮中的每个按钮都具有不同的" name "属性。在我的控制器中,我的代码类似于以下内容:

1
2
3
4
5
6
7
if params[:remove]
  #do stuff to remove item from shopping cart, then re-direct back to shopping cart
elsif params[:order_one]
  #do stuff to order item, then render a confirm page
else
  #do stuff to order multiple items, then render confirm page
end

但这对我来说似乎很混乱。是否有更好的" railsy"方法来实现此目的?

此外,我目前在页面中未使用任何JS / Ajax,我希望最终使购物车成为通过Ajax呈现的div。当用户单击"删除"按钮时,我希望该表单可以远程提交,这样一旦从购物车中删除了商品,就可以通过Ajax重新呈现购物车div-这将是可能的吗?一个通过ajax提交某些表单的按钮,以及一些没有ajax表单的按钮?


这是一个广泛的主题,但是对于ajax删除按钮,您可以这样开始。在表格视图中,使用:

1
2
3
4
<tr id="tr_<%= item.id %>">
  ...
  <%= link_to 'delete', item, method: :delete, remote: true %>
</tr>

您必须在items_controller.rb

中处理销毁路径上的ajax调用

1
2
3
4
5
6
7
def destroy
  @item= Item.destroy(params[:id])
  respond_to do |format|
    format.html { redirect_to items_url }
    format.js
  end
end

在您的items views文件夹中创建一个新的destroy.js.erb文件并将其放入:

1
$('#your_table').remove('#tr_<%= @item.id %>');

然后,当您单击删除按钮时,它将调用控制器中的destroy动作。由于该按钮被定义为远程按钮,所以Rails会自动执行ajax请求,并且不会重新加载页面。您的控制器将呈现相应的js视图,然后在该视图中从表中删除该行。

正如我所说,这仅仅是开始,可以在javascript方面做得更好。另请注意,我没有检查代码。

也可以查看http://railscasts.com/episodes/136-jquery-ajax-revised?view=asciicast以获得更深入的解释。