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

Rails重写Devise控制器遭遇路由错误,寻求解决方案

修复Rails中Devise API路由的控制器未初始化错误

问题场景

我在Rails中重写Devise控制器的代码如下:

module Api
  module V1
    module Devise
      class RegistrationsController < Devise::RegistrationsController
        # 自定义逻辑
      end
    end
  end
end

对应的路由配置:

Rails.application.routes.draw do
  root 'application#index'

  devise_for :users
  devise_for :taxi_drivers, only: :passwords

  resources :taxi_drivers_groups, only: %i[index new create edit update]

  namespace :api do
    namespace :v1 do
      devise_for :users,
        defaults: { format: :json },
        class_name: 'User',
        skip: %i[registrations sessions passwords],
        path: '',
        path_names: { sign_in: 'login', sign_out: 'logout' }

      devise_scope :user do
        post 'signup', to: 'devise/registrations#create'
        post 'login',  to:'devise/sessions#create'
        delete 'logout', to: 'devise/sessions#destroy'
        post 'password_recover', to: 'devise/passwords#create'
        put 'password_recover', to: 'devise/passwords#update'
      end
    end
  end
end

运行测试时抛出错误:

ActionController::RoutingError: uninitialized constant Api::V1::Devise::RegistrationsController

测试代码:

test 'user invalid sigup with empty fields' do
  @valid_signup_params[:name] = nil

  post('/api/v1/signup.json', { user: @valid_signup_params }, headers: { format: :json })

  assert_equal last_response.status, 422
  assert_equal json_response['errors']['name'].count, 1
end

修复步骤

1. 对齐文件路径与模块结构

Rails自动加载机制要求文件路径必须和模块命名严格匹配。你的控制器模块是Api::V1::Devise::RegistrationsController,所以文件必须放在:
app/controllers/api/v1/devise/registrations_controller.rb

如果文件位置不正确,Rails无法找到对应的常量,就会触发未初始化错误。

2. 修正路由中的控制器指向

当前路由里的to: 'devise/registrations#create'会让Rails在Api::V1命名空间下寻找Devise::RegistrationsController。可根据实际情况调整路由:

devise_scope :user do
  # 情况1:控制器在api/v1/devise下,确保文件路径正确后保持原写法
  post 'signup', to: 'devise/registrations#create'
  # 情况2:直接指定完整控制器路径,避免命名空间歧义
  post 'signup', to: 'api/v1/devise/registrations#create'
  # 情况3:如果去掉控制器的Devise嵌套模块,路由改为
  post 'signup', to: 'registrations#create'
end

若选择情况3,需调整控制器模块结构:

module Api
  module V1
    class RegistrationsController < Devise::RegistrationsController
      # 自定义逻辑
    end
  end
end

对应的文件路径改为app/controllers/api/v1/registrations_controller.rb。

3. 清除缓存并重启服务

开发或测试环境下,修改文件后可能存在缓存问题,需要:

  • 重启Rails服务器(开发环境)
  • 重启测试进程(测试环境)
  • 执行rails tmp:clear清除临时缓存文件

4. 验证控制器继承与拼写

检查控制器类名、模块名的拼写是否正确(Rails对常量大小写敏感),确保正确继承了Devise::RegistrationsController,无语法错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:05:43