Rails button_to并使用patch vs post

时间:2014-03-13 00:26:34

标签: ruby-on-rails

我很难让rails使用'button_to'标签和补丁请求vs post。

这是我的标签:

<%= button_to 'Start Game', { :controller => 'provides', :id => @prov_id}, :method => :patch %>

我在我的路线中使用'资源:提供',我在Provide控制器中有一个更新方法。

这是我运行rake路线时提供的输出..

    provides GET    /provides(.:format)            provides#index
             POST   /provides(.:format)            provides#create
 new_provide GET    /provides/new(.:format)        provides#new
edit_provide GET    /provides/:id/edit(.:format)   provides#edit
     provide GET    /provides/:id(.:format)        provides#show
             PATCH  /provides/:id(.:format)        provides#update
             PUT    /provides/:id(.:format)        provides#update
             DELETE /provides/:id(.:format)        provides#destroy

所有正常工作,但我收到以下错误...

Started PATCH "/provides?id=1" for 127.0.0.1 at 2014-03-12 19:20:28 -0500

ActionController::RoutingError (No route matches [PATCH] "/provides"):

这里出了什么问题?这让我感到疯狂,任何帮助都受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

您有一条路线:PATCH /provides/:id(.:format),但"/provides?id=1"没有PATCH路线

尝试:

<%= button_to 'Start Game', provide_path(@prov_id), :method => :patch %>

查看更多:http://guides.rubyonrails.org/routing.html

答案 1 :(得分:0)

我很确定您需要为PATCH设置表单标记,因为浏览器当前不会生成非AJAX PATCH请求。

所以将:method => :patch传递给form_for,如下所示:

<%= form_for @provides, method: :patch do |f| %>
  <%= f.hidden_field :foo, value: 'somevalue' %>
  <%= f.submit 'Start Game' %>
<% end %>

这将发送一个方法参数,rails将检测并且您的控制器可以作为真正的PATCH处理。我在示例中包含了为实际补丁传递隐藏参数的能力,因为它不清楚PATCH在您的示例中将提供什么用途。

注意:不要尝试将上面的html嵌入到另一个表单中。 HTML规范不允许嵌套form标记。