如何让表单使用 :method => :delete(Rails)

10

我有一个购物车,其中包含许多line_items。我想在每个line_item旁边放一个"删除"按钮,点击后可以将该line_item从购物车中删除。

我知道可以使用button_to方法实现这一点,但是我想使用form_for方法,因为我还想同时更改line_item父对象的属性(每个line_item也属于一个course,我想告诉course父对象它不再在购物车中)。

以下是使用form_for的代码:

<%= form_for(line_item, :method => :delete, :remote => true) do |f| %>
<%= f.submit :value => "Delete" %>
<% end %>

根据Ruby文档,只需添加 :method => :delete 即可(http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for),但渲染的HTML并不完全正确。

<input name="_method" type="hidden" value="put">

但应该是这样:

<input name="_method" type="hidden" value="delete">

我做错了什么?

2个回答

14

Mark Needham发表了一篇博客文章,讲述了为什么在form_for中使用:method => delete无法正常工作。 他说:

事实证明,'form_for'希望将'method'作为哈希的一部分与键':html'一起作为最右侧参数的一部分提供。

因此,您需要将代码更改为:

<%= form_for(line_item, :method => :delete, :remote => true) do |f| %>

收件人:

<%= form_for(line_item, :html => { :method => :delete, :remote => true }) do |f| %>

我在一个Rails 3.0应用程序中尝试过,生成的HTML如下:

<input type="hidden" value="delete" name="_method">

0

HAML 中的我的代码只是:

    = form_with url: destroy_user_session_path, method: :delete do |form|
      = form.submit "Sign out"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接