Rails-如何在Devise注册表中添加其他列值?

时间:2019-01-17 19:13:02

标签: ruby-on-rails devise

用户模型

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文件。)

https://repl.it/@aravin/HarmlessRepentantHarddrive

2 个答案:

答案 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提供的更为详细的答案。

  1. 您可以使用以下命令生成registrations_controller.rb文件:

    rails g devise:controllers users -c=registrations

  2. 完成此操作后,您将需要对其进行修改,使其具有类似以下内容:

    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
    
  3. 然后在routes.rb文件中,您需要更改devise_for行,以告知devise您想覆盖注册控制器,例如:

    devise_for :users, controllers: { registrations: 'users/registrations' }

    当然,如果在我的示例中使用的不是标准用户,则要将:user /:users引用替换为设备身份验证模型的名称。

Here is a reference to this in the official docs on GitHub