【问题标题】:rails 4.2 link_to method: No route matches [POST]rails 4.2 link_to 方法:没有路线匹配 [POST]
【发布时间】: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 是什么:&lt;%= link_to 'disable token', u, method: :delete, data: { confirm: 'Are you sure?'} %&gt;
  • 我已经通过编辑我的问题的正文和标题回答了上述问题。但更直接的答案是:查看 link_to 生成的 HTML 的正文;我正在使用 Rails 4.2.5.2; u 是用户模型的一个实例。

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


【解决方案1】:

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

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

【讨论】:

  • 感谢阿德里安的建议,但恐怕没用。
  • 好的,是否返回了同样的错误?另外,您可以将路由文件的内容添加到您的问题中吗?然后,如果我能进一步提供帮助,我将修改我的答案或将其删除。
【解决方案2】:

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

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

【讨论】: