设计多态关联两个注册表单和一个登录表单

时间:2017-04-13 09:43:39

标签: ruby-on-rails ruby devise polymorphic-associations

我目前正在构建一个招聘网络应用程序,我有两种类型的用户雇主和候选人。我希望这两种类型的用户拥有不同的注册页面但只有一个登录页面,例如Hired - Job Search Marketplace. Job Hunting Simplified!正在为其注册表格做什么,这里是我做过的事情到目前为止

的routes.rb

 Rails.application.routes.draw do
  root 'home#index'

  resources :profiles, except: [:new, :create]
  resources :companies, except: [:new, :create]
  devise_for :users, skip: [:registrations, :sessions]
  devise_scope :user do
    get '/login' => 'devise/sessions#new', as: 'new_user_session'
    post '/login' => 'devise/sessions#create', as: 'user_session'
    match 'logout', to: 'devise/sessions#destroy', as: :destroy_user_session, via: Devise.mappings[:user].sign_out_via
  end
  get '/new_employer' => 'companies#new', as: 'new_employer'
  post '/new_employer' => 'companies#create'
  get '/new_applicant' => 'profiles#new', as: 'new_applicant'
  post '/new_applicant' => 'profiles#create'
end

User.rb

    class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  belongs_to :user_profile, polymorphic: true
  scope :employer?, -> { where(user_profile_type: 'Company') }
  scope :applicant?, -> { where(user_profile_type: 'Profile') }
  scope :admin?, -> { where(admin: true) }
end

Companies_controller.rb

class CompaniesController < ApplicationController
  before_action :set_company, only: [:show, :edit, :update, :destroy]
  # GET /companies
  # GET /companies.json
  def index
    @companies = Company.all
  end

  # GET /companies/1
  # GET /companies/1.json
  def show
  end

  # GET /companies/new
  def new
    @company = Company.new
    @company.build_user
  end

  # GET /companies/1/edit
  def edit
  end

  # POST /companies
  # POST /companies.json
  def create
    @company = Company.new(company_params)

    respond_to do |format|
      if @company.save
        format.html { redirect_to @company, notice: 'Company was successfully created.' }
        format.json { render :show, status: :created, location: @company }
      else
        format.html { render :new }
        format.json { render json: @company.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /companies/1
  # PATCH/PUT /companies/1.json
  def update
    respond_to do |format|
      if @company.update(company_params)
        format.html { redirect_to @company, notice: 'Company was successfully updated.' }
        format.json { render :show, status: :ok, location: @company }
      else
        format.html { render :edit }
        format.json { render json: @company.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /companies/1
  # DELETE /companies/1.json
  def destroy
    @company.destroy
    respond_to do |format|
      format.html { redirect_to companies_url, notice: 'Company was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_company
      @company = Company.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def company_params
      # params.require(:company).permit(:company_name, :company_website)
      params.require(:company).permit!
    end

end

公司/ _form.html.erb

    <%= simple_form_for(@company, url: new_employer_path) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :company_name %>
    <%= f.input :company_website %>
  </div>

    <%= f.simple_fields_for :user do |u| %>
        <div class="col-lg-6">
          <%= u.input :email %>
        </div>

        <div class="col-lg-6">
          <%= u.input :password %>
        </div>

        <div class="col-lg-6">
          <%= u.input :password_confirmation %>
        </div>
    <% end %>


    <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

我如何创造这个,谢谢你的预期。

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解您的问题,但在我看来,您只需要有两个不同的sign_up页面,因为登录时您可以使用devise的默认登录。

我会写一个自定义RegistrationController并继承自Devise::RegistrationsController

你可以让你的路线设置如下:

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

devise_scope :user do
   post '/user/create_applicant', to: 'registrations#create_applicant'
   post '/user/create_employer', to: 'registrations#create_employer'
end

然后你可以像这样创建registrations_controller

class RegistrationsController < Devise::RegistrationsController
  def create_applicant
    # write your logic here
  end


  def create_employer
    # write your logic here
  end
end
相关问题