我只是想用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:
<%= link_to 'disable token', u, method: :delete, data: { confirm: 'Are you sure?'}, remote: true %>
答案 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的设置方式。