我正在尝试提交表单,但如果我只是提出form_for @classroom
我会得到一个"没有路由匹配[POST]"错误。
现在使用下面发布的代码,我在表单中输入了错误的网址。如果我在浏览器中手动更改网址,它会通过,我想我可以通过javascript做到这一点,但是......为什么......是......这......正在发生......?
直到昨天一切正常。我甚至尝试回到我改变的事情,但我似乎无法追踪出现了什么问题。
patch 'classrooms/:id/update' => "classrooms#update", as: :update_classroom
resources :classrooms, except: :update
<%= 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
答案 0 :(得分:3)
为了给Tashow上面的答案添加一些特异性(这使我走上了正确的轨道),我有一些隐藏的字段看起来像这样,以嵌套的形式:
<%= hidden_field_tag("Classroom[classroom_teachers_attributes][]", nil) %>
<%= hidden_field_tag("Classroom[classroom_teachers_attributes][]", '') %>
一旦我摆脱了这些,一切都开始正常工作了。 (仍有<input>
等生成的类似fields_for
标签。
答案 1 :(得分:2)
经过一些试验和错误之后,我意识到我在表单的更深层嵌套级别中留下了一些普通的输入标记(而不是使用普通的fields_for和每个级别的单独构建器)。我想这在某种程度上搞砸了关系并影响了父表单的方法。
这就是混乱的心态。
答案 2 :(得分:1)
只是从标题中回答你的问题,我认为你的表单方法是&#34; PATCH&#34;确实。请参阅指南http://guides.rubyonrails.org/form_helpers.html,了解rails如何制作补丁表单。
Rails框架鼓励您对应用程序进行RESTful设计,这意味着您将制作很多&#34; PATCH&#34;和&#34;删除&#34;请求(除了&#34; GET&#34;和&#34; POST&#34;)。但是,大多数浏览器都不支持&#34; GET&#34;以外的方法。和&#34; POST&#34;提交表格时。
Rails通过使用名为&#34; _method&#34;的隐藏输入模拟POST上的其他方法来解决此问题,该输入设置为反映所需的方法:
答案 3 :(得分:0)
form_for
将一个对象作为第一个参数,并且通常更好地保持类似于REST的rails处理update
方法的方式。
你html表单的action
显示&#34; / classrooms / 23 / edit&#34;所以是的,它不会工作。
form_for(@classroom, url: update_classroom_path(@classroom), method: "patch")