Rails - 如何使用设备和多态关联在单选按钮上切换配置文件?

Rails - how can I make a profile switch on a radio button using a device and polymorphic associations?

我是 rails 开发的新手。我需要有关自定义设备的帮助。我有具有多态关联的用户 - 可配置文件。注册的时候需要根据选中的radio button填写profiable

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
  before_action :configure_account_update_params, only: [:update]

  protected

  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: %i[email profilable])
  end

  def configure_account_update_params
    devise_parameter_sanitizer.permit(:account_update, keys: %i[email])
  end
end

模型用户

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  belongs_to :profilable, polymorphic: true

  def set_client_profile
    c = ClientProfile.new
    self.profilable = c
  end

  def set_realtor_profile
    r = RealtorProfile.new
    self.profilable = r
  end
end

型号客户资料

class ClientProfile < ApplicationRecord
  has_one :user, as: :profilable
end

模型房地产经纪人简介

class RealtorProfile < ApplicationRecord
  has_one :user, as: :profilable
end

这在我的 views/devise/registrations/new.html.erb

<div class="field">
    <%= f.label :profilable, 'Client' %>
    <%= f.radio_button :profilable, 'Client' %>
    <%= f.label :profilable, 'Realtor' %>
    <%= f.radio_button :profilable, 'Realtor'%>
    <% if params[:profilable] == 'Client' %>
      <% resource.set_client_profile %>
    <% else %> 
      <% resource.set_realtor_profile %>
    <% end %>
  </div>

这是注册后的错误:

1 个错误禁止保存此用户: 可分析的必须存在

抱歉这个可怕的代码

这部分代码

 <% if params[:profilable] == 'Client' %>
      <% resource.set_client_profile %>
    <% else %> 
      <% resource.set_realtor_profile %>
    <% end %>

只会在视图渲染时执行。这里的 resource 是一个空模型,仅用于创建表单。此实例不是 create 请求到达服务器后创建的实际模型。 因此,set_client_profileset_client_profile 都不会在控制器的 create 方法中被调用。此代码应删除。

我想最简单的方法是在 Users::RegistrationsController 中重新定义 create 方法。这个方法的原始代码可以在repo中找到。 所以,可以这样修改:

 def create
    build_resource(sign_up_params)

    #here comes your modification
    if sign_up_params[:profilable] == 'Client'
      resource.set_client_profile
    else
      resource.set_realtor_profile
    end

    resource.save
    # After that, copy the rest of the original `create` method
    ...