![](/img/trans.png)
[英]How to make has many through polymorphic associations dependent in rails 3?
[英]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_profile
和set_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.