You need to enable JavaScript to run this app. Rails Devise 如何正确嵌套资源实现用户路由挂载到je资源下
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 14:54:11