rails 4.2 link_to方法:没有路由匹配[POST]

时间:2016-03-01 06:10:44

标签: ruby-on-rails-4 rails-routing link-to

我只是想用link_to构建一个method: :delete来调用我的用户控制器中的destroy方法:

<%= link_to 'disable token', user_path(user), method: :delete, data: { confirm: 'Are you sure?'} %>

生成的HTML看起来像:

<a data-confirm="Are you sure?" rel="nofollow" data-method="delete" href="/users/6">disable token</a>

我的application.js文件有:

//= require jquery                                                                                                                                            
//= require jquery_ujs  

事实上,我知道javascript已加载并正在执行它应该做的事情,因为它会生成“你确定吗?”警告对话框。

但是,在关注链接后,我会得到以下内容:

No route matches [POST] "/users/9"

确实没有这样的路线,因为我唯一的路线是:

users_path  GET /users(.:format)    users#index
user_path   DELETE  /users/:id(.:format)    users#destroy

这个谜(对我而言)是为什么Rails首先在这条路线上进行POST?您会注意到URL是正确的(“/ users / 9”),但HTTP动词不是:POST。

请求的参数已设置:

{"_method"=>"delete",
 "authenticity_token"=>"VcAVJF1/f9mwjNI4GPteRtDiyjKobnioF0hIQvF+3BVMzUnIoHymM2Z3w2sqSLJqJ11sZ/tIHt78aA9
}

在这里,您可以看到_method密钥设置为delete,因此为什么路由错误?!?

我很难过。

修改:如果我将link_to调用更改为包含remote: true Rails,则将其路由到正确的路线!所以,作为一个“修复”,我已经改变了我的控制器使用UJS,但我不喜欢这个,因为,好吧,据我所知,我以前应该工作!

这是link_to调用,它以JS:

的形式发送正确的DELETE请求
<%= link_to 'disable token', u, method: :delete, data: { confirm: 'Are you sure?'}, remote: true %>                                                                                                                                                                                  

2 个答案:

答案 0 :(得分:0)

尝试明确说明控制器操作和方法(注意@user.id是一个示例,您可能会以不同的方式引用它)url_for

<%= link_to 'disable token', url_for(action: :destroy, id: @user.id), method: :delete, data: { confirm: 'Are you sure?'} %>

答案 1 :(得分:0)

我怀疑在这种情况下,还有一些其他的javascript覆盖了rails的行为。

我遇到了同样的问题(但是它获得了GET请求,而不是POST)。结果是一个完全不相关的JS在选择器中过于笼统,并且在按钮周围的所有锚标签上调用jquery的stopPropagation,这就是我的特定HTML的设置方式。