Rails Devise注册时full_name参数始终提示Unpermitted parameter问题排查
问题排查与解决方案
1. 校验请求参数结构
现在你已经可以触发pry断点,首先在create方法断点处执行pp params,确认两个点:
full_name参数是否正确嵌套在user字段下,而不是直接放在参数最外层- 参数名是否存在拼写错误(比如写成
fullname、FullName等不符合预期的格式)
2. 清理冲突的强参数配置
你同时在ApplicationController和自定义RegistrationsController都写了强参数配置,很可能出现配置覆盖问题:
- 先删除
ApplicationController中所有和devise_parameter_sanitizer相关的配置,仅保留自定义注册控制器里的配置即可 - 修正你方案3中的语法问题,
%i[full_name ]里多余的空格会导致参数匹配失败,调整后的代码如下:
class Users::RegistrationsController < Devise::RegistrationsController before_action :configure_sign_up_params, only: [:create] protected def configure_sign_up_params devise_parameter_sanitizer.permit(:sign_up, keys: [:full_name]) end end
3. 确认路由配置生效
在终端执行rails routes | grep registration,检查注册路由的Controller#Action是否确实指向users/registrations#create,如果有其他优先级更高的路由匹配了注册请求,会导致你的自定义控制器没有被调用。
你也可以在断点处执行self.class.name确认当前控制器是不是你自定义的Users::RegistrationsController。
4. 排查Devise扩展gem冲突
你路由里配置了invitations控制器,说明用到了devise_invitable扩展,这个gem会修改Devise默认的参数校验逻辑,需要额外补充对应场景的参数配置:
devise_parameter_sanitizer.permit(:invite, keys: [:full_name]) devise_parameter_sanitizer.permit(:accept_invitation, keys: [:full_name])
兜底方案:直接重写参数读取方法
如果以上方案都不生效,可以直接重写Devise预留的sign_up_params方法,这是优先级最高的参数配置方式,不会被其他逻辑覆盖:
class Users::RegistrationsController < Devise::RegistrationsController protected def sign_up_params params.require(:user).permit(:email, :password, :password_confirmation, :full_name) end end
内容的提问来源于stack exchange,提问作者Carlos Gómez
相关产品推荐
相关产品推荐

