You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

  • 改用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动作,该页面仅允许已登录用户访问。跳转到注册页的常见原因:

  1. 当前用户未登录,Devise自动重定向(部分配置会将未认证请求导向注册页而非登录页);
  2. Devise初始化配置修改了重定向规则。

解决步骤:

  • 先确认是否已登录:在页面添加<%= current_user.inspect %>查看用户状态,未登录则先登录再测试编辑链接;
  • 检查config/initializers/devise.rb,调整未认证请求的重定向目标:
    # 将未认证请求重定向到登录页
    config.unauthenticated_action = :redirect_to_sign_in
    
  • 若自定义了Devise的Registrations控制器,检查是否重写了edit动作的前置校验逻辑。

内容的提问来源于stack exchange,提问作者Maria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:06:14