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 - 设计强参数总是不允许注册的主要内容,如果未能解决你的问题,请参考以下文章