Rails 4没有改变post方法来修补

时间:2016-08-12 11:17:58

标签: ruby-on-rails-4 url-routing html-form-post

我正在尝试提交表单,但如果我只是提出form_for @classroom我会得到一个"没有路由匹配[POST]"错误。

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

直到昨天一切正常。我甚至尝试回到我改变的事情,但我似乎无法追踪出现了什么问题。

的routes.rb

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

从rails end

形成
<%= 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

4 个答案:

答案 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")