在rails中单个表单上有多个提交按钮的正确方法

时间:2013-04-18 19:34:58

标签: ruby-on-rails ajax forms submit-button

我的rails应用程序中有一个页面,要求我在一个表单上有多个提交按钮。为了让你知道我想要做什么,我有一个购物车,这是一个项目表。每个项目都有一个订单按钮和一个删除按钮。还有一个与每个项目相关联的复选框,以便可以选择多个项目,然后通过表格底部的按钮提交订单。

目前,这三个按钮中的每一个都具有与之关联的不同“名称”属性。在我的控制器中,我的代码类似于以下内容:

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

但这对我来说似乎很混乱。是否有更好的“固定”方式来实现这个?

另外,我目前没有在我的页面中使用任何JS / Ajax,我希望最终让购物车成为通过Ajax呈现的div。当用户点击删除按钮时,我希望远程提交表单,以便一旦从购物车中删除项目,就可以通过Ajax重新呈现购物车div - 这样就可以使用一个表单一个按钮通过ajax提交一些表单,一些表单没有ajax?

1 个答案:

答案 0 :(得分:0)

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

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

您必须在items_controller.rb

中的销毁路线上处理ajax调用
def destroy
  @item= Item.destroy(params[:id])
  respond_to do |format|
    format.html { redirect_to items_url }
    format.js
  end
end

在项目视图文件夹中创建一个新的destroy.js.erb文件,并将其放入其中:

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

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

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

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