Rails Devise 如何正确嵌套资源实现用户路由挂载到je资源下
问题根因
默认在嵌套资源块内调用devise_for :users时,Devise会自动为生成的路由创建以映射名为前缀的顶级路径作用域,将嵌套的资源路径拼接在该前缀之后,最终生成不符合预期的/users/jes/:je_id/sign_in格式路由,无法实现资源在前、Devise认证路径在后的顺序要求。
正确实现配置
root to: 'pages#home' devise_for :admins, controllers: { sessions: 'admin/sessions', registrations: 'admin/registrations' } resources :jes, param: :nom do devise_for :users, as: 'user_je', path_prefix: '', path: 'users', controllers: { sessions: 'users/sessions', registrations: 'users/registrations' } end
关键配置说明
as: 'user_je':保持原有路由命名规则不变,生成的路由名称为user_je_session,避免现有代码中的路由助手调用出现报错path_prefix: '':告知Devise不要在路由生成时强制添加/users作为顶级路径前缀,直接复用当前嵌套在/jes/:je_id下的路径作用域path: 'users':将Devise的用户认证路径拼接到当前嵌套作用域之后,最终生成符合要求的/jes/:je_id/users/sign_in格式路由
验证方式
运行路由检查命令,确认生成的路由格式符合预期:
rails routes | grep user_je_session
正常输出应匹配目标格式:user_je_session POST /jes/:je_id/users/sign_in(.:format) users/sessions#create
配套注意事项
- 不要在
resources :jes块外重复调用devise_for :users,否则会生成重复的顶级Devise路由,造成路由规则冲突 - 因为路由现在携带了
je资源上下文,需要在对应的Devise控制器(Users::SessionsController、Users::RegistrationsController)中增加前置逻辑,根据路由携带的params[:je_id]加载对应的je资源,完成多账号关联逻辑的校验
内容的提问来源于stack exchange,提问作者cefsdp
相关产品推荐
相关产品推荐

