繁体   English   中英

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

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

我是 Rails 开发的新手。 我需要有关自定义设备的帮助。 我有具有多态关联的用户 - 可分析的。 注册时,我需要根据选择的单选按钮填写概要文件。

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

model 用户

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

model 客户资料

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

model RealtorProfile

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

这在我看来/设计/注册/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 个错误禁止保存此用户: Profilable 必须存在

对不起这个可怕的代码

这部分代码

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

只会在视图渲染时执行。 此处的resource是一个空的 model,您仅用于创建表单。 此实例不是实际的 model,它将在create请求到达服务器后创建。 因此, set_client_profileset_client_profile都不会在 controller 的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
    ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM