Rails 5 - 设计sign_up后清空用户配置文件

时间:2016-11-29 13:19:44

标签: ruby-on-rails ruby devise ruby-on-rails-5 user-profile

我是Rails的新手并且正在构建一个工作板市场。我坚持使用用户注册配置文件表单。我正在使用带有Rails 5的设计(4.2)。我在user_create之前创建了配置文件,然后只是重定向到配置文件视图,现在使用注册表单字段来更新用户,例如first_name&姓氏。

我的注册是一个双向进程,而不是嵌套的配置文件。 第1步 - 设计一个额外字段的注册表单,以检查用户(求职者)或公司的角色。 第2步 - 基于此角色,为用户和公司创建单独的配置文件表单。如果配置文件未提交给DB,则也不应保存用户,并且必须再次发生用户sign_up。

目前,我正在尝试使用一个包含first_name和last_name字段的通用用户表单。我在用户模型中使用了before_create:build_profile,但它只传递了Profile.create而没有在DB上创建它。我应该在profiles_controller或registrations_controller(设计)中覆盖'create'or'new'。

views / profiles / show.html.erb中的错误是:表单中的第一个参数不能包含nil或为空。同样在终端上我看到了这个配置文件:“user_id”=>“2”,“id”=>“profile_id”} ...这是否表示数据库中用户和配置文件表之间存在妨碍创建或路线设置正确吗?

的routes.rb

Rails.application.routes.draw do
   root "jobs#index"
  devise_for :users, :controllers => {registrations: "registrations"}
  resources :users do

    resources :profiles, only: [:show, :update]
  end
end

Registrations_controller

class RegistrationsController < Devise::RegistrationsController
    protected
    def after_sign_up_path_for(user)
      if resource.class == User && current_user.role == 'user'
        user_profile_path
      else # to check for company user resource.class == User && current_user.role == 'company'
        puts "redirecting to company profile-will do later"
      end
    end
  end

profiles_controller.rb

      class ProfilesController < ApplicationController

      def show
      end

      def update
        @profile = Profile.find_by_user_id(profile_params)
        current_user.update(@profile)
      end

      def destroy
        @profile.destroy
        respond_with(@profile)
      end

      private

      def profile_params
        params.require(:user).permit(profile_attributes: [])
      end

      def set_profile
        @profile = Profile.find(params[:id])
      end
    end

profile.rb

class Profile < ApplicationRecord
  belongs_to :user
end

user.rb

   class User < ApplicationRecord
      before_create :build_profile
      devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
     enum role: [:user, :company, :admin]
      has_one :profile

      def build_profile
        Profile.create
        true
      end

1 个答案:

答案 0 :(得分:0)

我建议你使用一种基于继承的方法。

您可以在users表中添加一个类型,Rails将为您管理它。

<强> example_timestamp_add_type_to_users.rb

class AddTypeToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :type, :string, null: false
  end
end

使用此功能,您可以根据需要添加用户类型:

<强>模型/ job_seeker.rb

class JobSeeker < User
  has_one :job_seeker_profile, dependent: :destroy
  after_create :profile

  private

  def profile
    create_job_seeker_profile
  end
end

<强>模型/ company_owner.rb

class CompanyOwner < User
  has_one :company_owner_profile, dependent: :destroy
  after_create :profile

  private

  def profile
    create_company_owner_profile
  end
end

<强>模型/ admin.rb

class Admin < User
end

此方法允许您使用基于用户类型的身份验证方法:

求职者

  1. current_job_seeker
  2. authenticate_job_seeker!
  3. 公司所有者

    1. current_company_owner
    2. authenticate_company_owner!
    3. 管理员

      1. current_admin
      2. authenticate_admin!
      3. 您还可以为每种用户类型构建不同的注册和/或登录表单:

        <强>配置/ routes.rb中

        Rails.application.routes.draw do
          devise_for :admins
          devise_for :job_seekers
          devise_for :company_owners
        end