用户模型
class User < ApplicationRecord
belongs_to :tenant, dependent: :destroy
end
租户模型
class Tenant < ApplicationRecord
has_many :users
end
控制器
解决方法1(不起作用)
def create
super
@tenant = Tenant.new
@user = @tenant.build_user(params)
@tenant.save
end
解决方法2(不起作用)
def create
@tenant = Tenant.new
@user = User.build(params)
@tenant.save
super
end
是否有可能传递参数来设计超类?
由于Devise超级方法在用户注册/密码哈希/上具有其自身的功能,因此我无法完全覆盖该功能。
我知道我的储蓄方式是错误的,请向我建议更好的方法。
实际源代码:
(添加了Controller,Model,Migrations和Routes文件。)
答案 0 :(得分:3)
您可以在控制器中覆盖sign_up_params
:
class RegistrationsController < Devise::RegistrationsController
private
def sign_up_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation...).merge({tenant_id: Tenant.create!.id})
end
end
答案 1 :(得分:1)
我想提供比AbM提供的更为详细的答案。
您可以使用以下命令生成registrations_controller.rb文件:
rails g devise:controllers users -c=registrations
完成此操作后,您将需要对其进行修改,使其具有类似以下内容:
class RegistrationsController < Devise::RegistrationsController
private
def sign_up_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
def account_update_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :current_password)
end
end
然后在routes.rb文件中,您需要更改devise_for行,以告知devise您想覆盖注册控制器,例如:
devise_for :users, controllers: { registrations: 'users/registrations' }
当然,如果在我的示例中使用的不是标准用户,则要将:user /:users引用替换为设备身份验证模型的名称。