Ruby on Rails中Devise登出与编辑用户路由异常求助
解决Devise登出链接和编辑资料页的问题
一、登出链接提示"No route matches [GET] "/users/sign_out""
你指定了method: :delete但浏览器仍用GET请求,核心原因是Rails依赖UJS(无侵入式JavaScript)模拟DELETE请求,若页面未加载相关JS,浏览器会默认用GET访问链接。
解决方法:
确保加载Rails的JavaScript
检查app/views/layouts/application.html.erb是否包含对应版本的JS加载代码:- Rails 7+(Importmap):
<%= javascript_importmap_tags %> - Rails 6及以下(Sprockets):
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
同时确认
app/assets/javascripts/application.js(旧版本)里有//= require jquery_ujs,或Importmap已引入@rails/ujs。- Rails 7+(Importmap):
改用Turbo兼容写法
若项目使用Turbo,替换为Turbo支持的属性:<%= link_to "Sign Out", destroy_user_session_path, data: { turbo_method: :delete } %>临时用button_to替代link_to
button_to会自动生成含DELETE方法的表单,无需依赖JS:<%= button_to "Sign Out", destroy_user_session_path, method: :delete %>
二、编辑资料页跳转到注册页
从路由看,edit_user_registration_path指向/users/edit,对应devise/registrations#edit动作,该页面仅允许已登录用户访问。跳转到注册页的常见原因:
- 当前用户未登录,Devise自动重定向(部分配置会将未认证请求导向注册页而非登录页);
- Devise初始化配置修改了重定向规则。
解决步骤:
- 先确认是否已登录:在页面添加
<%= current_user.inspect %>查看用户状态,未登录则先登录再测试编辑链接; - 检查
config/initializers/devise.rb,调整未认证请求的重定向目标:# 将未认证请求重定向到登录页 config.unauthenticated_action = :redirect_to_sign_in - 若自定义了Devise的Registrations控制器,检查是否重写了
edit动作的前置校验逻辑。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

