Devise配置嵌套模块内Group::User模型路由时遇到类未初始化错误
嘿,我碰到过好几次这种嵌套模型用Devise的情况,你这个问题其实是Devise默认的类名映射逻辑在搞鬼~
当你用devise_for :group_users的时候,Devise会自动把这个符号转换成驼峰式的类名GroupUser,但你的实际类是Group::User(属于Group模块下的User类),所以它自然找不到对应的类,就抛出“uninitialized class GroupUser”的错误了。
给你几个靠谱的解决办法,按你的需求选就行:
直接指定类名(最简单的方案)
在routes.rb里给devise_for加上class_name参数,明确告诉Devise要找的是嵌套模块里的类:devise_for :group_users, class_name: 'Group::User'这样Devise就不会瞎猜类名了,直接定位到
Group::User。用命名空间配合(适合需要嵌套路由结构的场景)
如果希望Group::User的路由带上/group前缀(比如/group/users/sign_in),可以用namespace包裹devise_for,同时也要指定class_name:namespace :group do devise_for :users, class_name: 'Group::User' end这种方式更符合你“Group下的用户”的业务逻辑,路由结构也更清晰。
先确认模型文件和类定义没问题
别光改路由,先检查你的模型文件位置对不对:Group::User的模型文件必须放在app/models/group/user.rb,而且类的定义要正确:# app/models/group/user.rb module Group class User < ApplicationRecord # 这里加上你需要的Devise模块,比如: devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end end另外,数据库迁移文件里的表名得是
group_users,不然Rails找不到对应的表,也会间接导致类加载的问题。自定义控制器的情况(如果需要定制登录注册逻辑)
要是你想给Group::User写自定义的Devise控制器,比如Group::Users::SessionsController,记得在路由里指定控制器路径:devise_for :group_users, class_name: 'Group::User', controllers: { sessions: 'group/users/sessions', registrations: 'group/users/registrations' }控制器文件要放在
app/controllers/group/users/sessions_controller.rb,继承Devise的对应控制器就行。
内容来源于stack exchange

