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_profile
和 set_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
...
我是 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_profile
和 set_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
...