【发布时间】:2026-02-20 13:45:02
【问题描述】:
我只是想用method: :delete 构造一个link_to 来在我的用户控制器中调用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 %>
【问题讨论】:
-
顺便说一句——我已经浏览了 Stack 上与 link_to 和 method::delete 相关的各种问答,但找不到有这个确切问题的人。如果有范围答案,请发布!谢谢。
-
也许使用 chrome 开发者工具之类的工具并检查此
link_to生成的 HTML 会有所帮助。您还可以使用它来确保您查看的是正确的链接。 -
您的应用程序中使用了哪个版本的rails?
-
嗨,这行中的
u是什么:<%= link_to 'disable token', u, method: :delete, data: { confirm: 'Are you sure?'} %>? -
我已经通过编辑我的问题的正文和标题回答了上述问题。但更直接的答案是:查看 link_to 生成的 HTML 的正文;我正在使用 Rails 4.2.5.2; u 是用户模型的一个实例。
标签: ruby-on-rails-4 rails-routing link-to