【问题标题】:How to create a record in a polymorphic association with multiple types of users如何在与多种类型的用户的多态关联中创建记录
【发布时间】: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


    【解决方案1】:

    我认为你不能使用那个方案

    KEYS_FOR_SIGNUP = %i[
        meta_type
        email
        password
        password_confirmation
        [ admin_attributes: [ :degree_access, :department] ]
        [ original_user_attributes: [:first_name, :last_name, :team] ]
    ].freeze
    

    因为你会得到:"[admin_attributes: [ :degree_access, :department]]" 而不是预期的行为。你必须使用没有文字的普通数组%i

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 2019-09-10
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多