【发布时间】:2020-06-23 22:47:29
【问题描述】:
我有多种用户类型的多态关联,admin 和 original_user。
我需要创建一个包含相关模型所有属性的用户注册,但我只能在相关表中创建记录的 ID,例如 Admin 或 OriginalUser。
如果我有嵌套属性怎么办?
在终端调试我的代码时,我看到:
Unpermitted parameter: :admin_attributes
而sign_up_params只有
{"email"=>"ush@gmail.com", "password"=>"123456", "password_confirmation"=>"123456", "meta_type"=>"admin"}
没有admin_attributes。
admin 的属性是 "degree_access"(integer), "department"(string)。
原始用户的属性为first_name(string)、last_name(string) 和team(string)。
app/models/user.rb:
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :tasks, dependent: :destroy
belongs_to :meta, polymorphic: true, validate: true
accepts_nested_attributes_for :meta
end
app/models/admin.rb:
class Admin < ApplicationRecord
has_one :user, as: :meta, dependent: :destroy
end
app/models/original_user.rb:
class OriginalUser < ApplicationRecord
has_one :user, as: :meta, dependent: :destroy
end
app/controllers/users/registrations_controller.rb:
module Users
class RegistrationsController < Devise::RegistrationsController
before_action -> { request.session_options[:skip] = true }
before_action :configure_sign_up_params
KEYS_FOR_SIGNUP = %i[
meta_type
email
password
password_confirmation
[ admin_attributes: [ :degree_access, :department] ]
[ original_user_attributes: [:first_name, :last_name, :team] ]
].freeze
def create
build_resource(sign_up_params)
if resource.meta_type == 'admin'
resource.meta = Admin.new
elsif resource.meta_type == 'original_user'
resource.meta = OriginalUser.new
end
if resource.save
render json: resource.payload
else
render json:
bad_request_params(resource.errors), status: :bad_request
end
end
protected
def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up,
keys: KEYS_FOR_SIGNUP)
end
end
end
【问题讨论】:
标签: ruby-on-rails ruby postgresql devise polymorphic-associations