获取表单使用:method =>:delete(rails)

jyl*_*li7 9 forms methods ruby-on-rails

我有一个包含许多line_items的购物车.我希望每个订单项旁边都有一个"删除"按钮,点击该按钮后会从购物车中删除line_item.

我知道我可以使用button_to方法执行此操作,但我想使用form_for,因为我想同时更改line_item的父对象的属性(每个line_item也属于一个课程,我会喜欢告诉课程的父母,它不再在购物车中).

这是我使用form_for的代码:

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

ruby文档说只需添加:method =>:delete应该可以工作(http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for),但渲染的html不是完全正确.它仍然是

<input name="_method" type="hidden" value="put">
Run Code Online (Sandbox Code Playgroud)

但它应该是:

<input name="_method" type="hidden" value="delete">
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

小智 12

马克李约瑟有一个博客帖子,讨论关于为什么:method => deleteform_for不工作.他说

事实证明,'form_for'期望':method'作为右手大多数参数的一部分提供,作为带有键':html'的哈希的一部分.

所以你需要改变你的代码:

<%= form_for(line_item, :method => :delete, :remote => true) do |f| %>
Run Code Online (Sandbox Code Playgroud)

至:

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

我在Rails 3.0应用程序中尝试过,生成的HTML是:

<input type="hidden" value="delete" name="_method">
Run Code Online (Sandbox Code Playgroud)