rails - 设计强参数总是不允许注册

Posted

技术标签:

【中文标题】rails - 设计强参数总是不允许注册【英文标题】:rails - devise strong parameters is always unpermitted for registration 【发布时间】:2021-12-09 03:44:59 【问题描述】:

我想在设计中允许 :full_name 参数用于我的用户模型注册,并且我总是得到 Unpermitted parameter: :full_name 作为对 Users::RegistrationsController#create 的响应行动

我已经尝试了几种方法,接下来我将向您展示:

1.应用程序控制器(选项 1)

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?
  
  protected
  
  def configure_permitted_parameters
    case params[:action]
    when 'create'
        devise_parameter_sanitizer.permit(:sign_up, keys: %i[full_name])
    when 'update'
        ...
    end
  end
end

结果 => 不允许的参数::full_name

2。注册控制器(选项 2)

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: :create
  
  protected
  
  def configure_sign_up_params
    params.require(:user).permit(%i[full_name])
  end
end

结果 => 不允许的参数::full_name

3.注册控制器(选项 3)

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: %i[full_name ])
  end
end

结果 => 不允许的参数::full_name

在我的 gemfile 中:

gem 'devise', '~> 4.8'

在我的路线中:

devise_controllers = 
  confirmations: 'users/confirmations',
  registrations: 'users/registrations',
  invitations: 'users/invitations',

devise_for :users, controllers: devise_controllers

我已经阅读了devise strong params,但老实说我不知道​​我做错了什么。

我还尝试在 Users::RegistrationsController#create 中进行调试:

def create
  super do
    binding.pry
  end
end

但它跳过了调试器断点...你知道发生了什么吗?

干杯!

编辑:

根据 JohnP 的建议,我只留下了 :full_name 用于 sign_up 的设计键参数消毒剂 我还删除了一个绕过我的调试断点的回调,现在我可以在创建操作中使用 pry 停止

【问题讨论】:

configure_sign_up_params before action 被执行了吗?我会在该方法中添加一个binding.pry 以确保它实际上正在执行 @arieljuod 是的,它正在执行 :( 如果我执行 ´params[:user]´ ´<:parameters>"abc@mail.com", "full_name "=>"carlos", "password"=>"password", "password_confirmation"=>"password" 允许:false>´ 【参考方案1】:

通常,您为特定控制器编写强参数,而不是在 ApplicationController 中,因为每个模型的允许条件都不同。使用devise_parameter_sanitizer 时,您只需要包含您要添加的额外字段 - 这不是从头开始设置您的强参数,只需将键添加到默认设计列表。

所以,您应该发现这就是您在 Users::RegistrationsController 中所需要的。

def configure_sign_up_params
  devise_parameter_sanitizer.permit(:sign_up, keys: [:full_name])
end

(顺便说一句,请确保您正确引用参数,如params[:user][:full_name]。)

(哦,如果您想进行调试,我建议您安装 byebug gem。您只需在要设置断点的位置添加额外的行 byebug。)

【讨论】:

感谢您的回答,您在 rails 控制台 devise_parameter_sanitizer 打印 sign_up、sign_in、account_update 键是正确的,我只是在复制它们,无论我是否遵循您的建议都不起作用,同样的结果 Unpermitted parameter :full_name。顺便说一句,我正在做 binding.pry 而不是 byebug 进行调试。 您是如何尝试使用该参数的?您使用的是params[:user][:full_name] 还是params[:full_name] 据我所知,在 devise 的文档中,我不必指向 :user,因为 devise_parameter_sanitizer 在这种情况下使用“安装”设计的资源的名称是模型用户,所以我的@resource_name 是:user,或者我必须做键:[user::full_name]?类似的东西? 你试过params[:user][:full_name]吗?这就是我使用的,它在User::RegistrationsController 中工作。 你能给我看看你的 User::RegistrationController configure_sign_up_params 函数吗?

以上是关于rails - 设计强参数总是不允许注册的主要内容,如果未能解决你的问题,请参考以下文章

Rails 强参数 - 允许在数组中进行深度嵌套哈希

如何允许具有强参数的数组

Rails 5,设计嵌套属性,未经许可的参数

Ruby on rails omniauth-twitter 和设计

Rails 设计多态 - 使用 Ajax 获取部分渲染

我无法在 Rails 中注册设计