Rails 4 不改变 post 打补丁的方法

Rails 4 not changing post method to patch

我正在尝试提交表单,但如果我只是输入 form_for @classroom,我会收到 "No route matches [POST]" 错误。

现在使用下面发布的代码,我在表单中得到了错误的 url。如果我在浏览器中手动更改 url 它会通过,我想我可以通过 javascript 做到这一点,但是......为什么......是......这......正在发生...... ?

直到昨天一切正常。我什至尝试回滚到我更改的内容,但我似乎无法追踪哪里出了问题。

routes.rb

patch 'classrooms/:id/update' => "classrooms#update", as: :update_classroom
resources :classrooms, except: :update

表格来自 rails 结束

<%= form_for(update_classroom_path(@classroom), method: "patch") do |class_f| %>

浏览器中的表单

<form action="/classrooms/23/edit" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="✓">
<input type="hidden" name="_method" value="patch">
<input type="hidden" name="authenticity_token" value="******">

耙路

        absences POST   /absences(.:format)                   absences#create
                 POST   /classrooms/:id/getAbsences(.:format) classrooms#getAbsences
update_classroom PATCH  /classrooms/:id/update(.:format)      classrooms#update
      classrooms GET    /classrooms(.:format)                 classrooms#index
                 POST   /classrooms(.:format)                 classrooms#create
   new_classroom GET    /classrooms/new(.:format)             classrooms#new
  edit_classroom GET    /classrooms/:id/edit(.:format)        classrooms#edit
       classroom GET    /classrooms/:id(.:format)             classrooms#show
                 DELETE /classrooms/:id(.:format)             classrooms#destroy
            root GET    /                                     pages#start

form_for 将一个对象作为第一个参数,通常最好保持类似 REST 的方式 rails 处理 update 方法。

您 html 的 action 表单显示“/classrooms/23/edit”,所以是的,它不会工作。

form_for(@classroom, url: update_classroom_path(@classroom), method: "patch")

经过更多的尝试和错误后,我意识到我在表单的更深层嵌套中留下了一些简单的输入标签(而不是使用正常的 fields_for 和每个级别的单独构建器)。我想这以某种方式搞砸了关系并影响了 parent 形式的方法。

那真是一团糟。

编辑:Andylee 的回答是正确的。我和 Jeremy 提到的可能是实际发生的问题,而不是最初假设的问题(如标题中所述)。

为了给上面 Tashow 的回答(这让我走上了正确的轨道)添加了一些特殊性,我有一些看起来像这样的嵌套形式的隐藏字段。:

<%= hidden_field_tag("Classroom[classroom_teachers_attributes][]", nil) %>
<%= hidden_field_tag("Classroom[classroom_teachers_attributes][]", '') %>

一旦我摆脱了这些,一切又开始正常工作了。 (仍然有由 fields_for 等生成的看起来相似的 <input> 标签)

根据标题回答你的问题,我认为你的表单方法确实是“PATCH”。请参阅指南 http://guides.rubyonrails.org/form_helpers.html,了解如何 rails 制作补丁表格。

The Rails framework encourages RESTful design of your applications, which means you'll be making a lot of "PATCH" and "DELETE" requests (besides "GET" and "POST"). However, most browsers don't support methods other than "GET" and "POST" when it comes to submitting forms.

Rails works around this issue by emulating other methods over POST with a hidden input named "_method", which is set to reflect the desired method: