使用 Devise 在用户注册时传递任意参数
Passing arbitrary parameters on user registration with Devise
我将 Devise 4.2.1 与 Rails 5.1 一起使用。我们的应用程序使用 MixPanel 的 JavaScript 库,该库在匿名网站访问者浏览时为其提供唯一 ID。
当用户创建帐户时,我们会将他们的匿名 ID link 转换为我们数据库中的已知用户 ID。为此,我们将用户的匿名 mixpanel_id
插入到注册表单的隐藏字段中,并将其与其他注册数据一起发布到 Devise 的注册控制器:
= vertical_form_for(resource, as: resource_name, url: registration_path(resource_name) do |f|
= f.input :name
= f.input :email
= f.input :password
= f.input :mixpanel_id, as: :hidden, input_html: { value: '' }
:javascript
after_load_once(function () {
mixpanel_promise.then(function (mixpanel) {
var id = mixpanel.get_distinct_id();
$('#user_mixpanel_id').val(id);
});
});
然后我们重写Devise中的create方法:
class RegistrationsController < Devise::RegistrationsController
def create
super
if resource.valid?
$mixpanel.alias(resource.id, params[:user][:mixpanel_id]) if params[:user][:mixpanel_id]
end
end
end
这对我们来说似乎工作正常。人们确实 linked 并且我们可以直接通过网站跟踪他们的行为,尽管我注意到一些人们没有被正确 linked 的奇怪行为。今天调查时,我注意到日志中有一些内容:Unpermitted parameter: :mixpanel_id
我查看了强参数,但由于 :mixpanel_id
不是用户的存储属性,我不确定如何在此处将其添加为允许的参数:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
end
end
Unpermitted parameter: :mixpanel_id
I looked into strong parameters, but because :mixpanel_id is not a
stored attribute on the user, I'm not sure how I can add it as a
permitted parameter here
您可以通过将 attr_accessor :mixpanel_id
添加到您的 User
模型来做到这一点
Class User < ActiveRecord::Base
attr_accessor :mixpanel_id
end
并在强参数中允许它
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :mixpanel_id])
end
我将 Devise 4.2.1 与 Rails 5.1 一起使用。我们的应用程序使用 MixPanel 的 JavaScript 库,该库在匿名网站访问者浏览时为其提供唯一 ID。
当用户创建帐户时,我们会将他们的匿名 ID link 转换为我们数据库中的已知用户 ID。为此,我们将用户的匿名 mixpanel_id
插入到注册表单的隐藏字段中,并将其与其他注册数据一起发布到 Devise 的注册控制器:
= vertical_form_for(resource, as: resource_name, url: registration_path(resource_name) do |f|
= f.input :name
= f.input :email
= f.input :password
= f.input :mixpanel_id, as: :hidden, input_html: { value: '' }
:javascript
after_load_once(function () {
mixpanel_promise.then(function (mixpanel) {
var id = mixpanel.get_distinct_id();
$('#user_mixpanel_id').val(id);
});
});
然后我们重写Devise中的create方法:
class RegistrationsController < Devise::RegistrationsController
def create
super
if resource.valid?
$mixpanel.alias(resource.id, params[:user][:mixpanel_id]) if params[:user][:mixpanel_id]
end
end
end
这对我们来说似乎工作正常。人们确实 linked 并且我们可以直接通过网站跟踪他们的行为,尽管我注意到一些人们没有被正确 linked 的奇怪行为。今天调查时,我注意到日志中有一些内容:Unpermitted parameter: :mixpanel_id
我查看了强参数,但由于 :mixpanel_id
不是用户的存储属性,我不确定如何在此处将其添加为允许的参数:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
end
end
Unpermitted parameter: :mixpanel_id
I looked into strong parameters, but because :mixpanel_id is not a stored attribute on the user, I'm not sure how I can add it as a permitted parameter here
您可以通过将 attr_accessor :mixpanel_id
添加到您的 User
模型来做到这一点
Class User < ActiveRecord::Base
attr_accessor :mixpanel_id
end
并在强参数中允许它
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :mixpanel_id])
end