已定义路由却出现Rails 7路由错误?登出功能故障求助
问题
我正在跟随Michael Hartl的Rails教程开发一个小型演示应用,目前在登出功能上遇到问题。点击登出链接时出现路由错误,预期行为是登出用户并跳转到登录页面。我怀疑是Turbo相关的问题,已在Gemfile中添加gem 'turbo-rails'并执行bundle,但无效果。
相关代码如下:
路由文件 routes.rb
Rails.application.routes.draw do resources :users get "/login", to: "sessions#new" post "/login", to: "sessions#create" delete "/logout", to: "sessions#destroy" # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html # Defines the root path route ("/") root 'users#index' end
Sessions控制器的destroy动作
def destroy log_out redirect_to root_url, status: :see_other end
Session Helper中的log_out方法
def log_out reset_session @current_user = nil end
视图中的登出链接
<%= link_to "Log out", logout_path, data: { 'turbo-method': :delete } %>
解决方案
1. 完成Turbo的完整安装流程
仅添加Gem并执行bundle不足以让Turbo正常工作,还需要执行初始化命令并重启服务器:
rails turbo:install # 执行完后重启Rails服务器
这个命令会生成Turbo所需的JavaScript配置文件,并确保相关资源被引入到项目中。
2. 修正link_to的data属性格式
Turbo对data-turbo-method的格式有严格要求,确保拼写和格式正确:
# 使用下划线形式的符号键 <%= link_to "Log out", logout_path, data: { turbo_method: :delete } %> # 或者使用短横线形式的字符串键 <%= link_to "Log out", logout_path, data: { "turbo-method": "delete" } %>
3. 临时禁用Turbo排查问题
如果仍无法解决,可以临时禁用该链接的Turbo,用传统方式测试:
<%= link_to "Log out", logout_path, method: :delete, data: { turbo: false } %>
注意:这种方式依赖Rails UJS,若项目未配置,需要先添加gem 'jquery-rails'并完成相关配置,但优先推荐解决Turbo的问题。
4. 验证路由配置正确性
运行以下命令查看路由列表,确认logout_path对应的HTTP方法为DELETE:
rails routes
正常输出应包含:
logout DELETE /logout(.:format) sessions#destroy
如果路由显示正确,说明问题出在前端请求方法的转换上,重点排查Turbo的加载和执行情况。
5. 检查浏览器控制台错误
打开浏览器开发者工具的控制台,查看是否存在Turbo相关的JavaScript错误(比如Turbo未加载、语法错误等),这能快速定位Turbo的加载问题。
内容的提问来源于stack exchange,提问作者Danijan
相关产品推荐
相关产品推荐

