You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:15:03