Rails 7重写Devise Registrations控制器无效问题求助
解决Devise重写Registrations控制器后仍跳转根路径的问题
你的问题核心是只重写了create方法,但没处理Devise默认拦截已登录用户访问注册页面的逻辑。Devise原生的RegistrationsController自带require_no_authentication前置动作,会在用户已登录时直接跳转到根路径,这个动作的执行优先级比你添加的authenticate_user!更高,导致你的代码根本没机会生效。
修复步骤
1. 修改自定义RegistrationsController
需要跳过Devise默认的登录拦截逻辑,同时重写new方法确保已登录用户能访问注册页面,再完善权限校验:
class RegistrationsController < Devise::RegistrationsController # 跳过Devise默认的已登录用户拦截,针对new和create动作 skip_before_action :require_no_authentication, only: [:new, :create] # 确保只有登录用户能访问这两个动作 before_action :authenticate_user!, only: [:new, :create] # 额外校验:仅管理员可创建新用户 before_action :ensure_admin!, only: [:new, :create] # 重写new方法,让已登录用户能进入注册页面 def new super end def create super end private def ensure_admin! unless current_user.admin? flash[:alert] = "你没有权限创建新用户。" redirect_to root_path end end end
2. 确认路由配置
你的路由配置是正确的,devise_for :users, controllers: { registrations: 'registrations' }已经指定了自定义控制器,无需修改。
关键说明
- Devise的
require_no_authentication是阻止已登录用户访问注册页的核心逻辑,必须针对new和create动作跳过它,才能让已登录用户进入注册页面。 - 将权限校验抽成独立的
ensure_admin!方法,同时在new和create动作前触发,既能拦截未授权用户访问页面,也能阻止其直接提交创建请求。
修改完成后,登录的管理员用户可正常访问new_user_registration_path创建新用户,非管理员登录用户会被拦截跳转,未登录用户则会先被要求登录。
内容的提问来源于stack exchange,提问作者TEJINDER SINGH
相关产品推荐
相关产品推荐

