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> |
您必须在
中处理销毁路径上的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文件夹中创建一个新的
1 | $('#your_table').remove('#tr_<%= @item.id %>'); |
然后,当您单击删除按钮时,它将调用控制器中的destroy动作。由于该按钮被定义为远程按钮,所以Rails会自动执行ajax请求,并且不会重新加载页面。您的控制器将呈现相应的js视图,然后在该视图中从表中删除该行。
正如我所说,这仅仅是开始,可以在javascript方面做得更好。另请注意,我没有检查代码。
也可以查看http://railscasts.com/episodes/136-jquery-ajax-revised?view=asciicast以获得更深入的解释。