2017-04-13 1 views
0

Je suis actuellement la construction d'une application web d'offres d'emploi, j'ai deux types d'utilisateurs employeur et candidat. Je veux que les deux types d'utilisateurs à faire signer différents des pages mais une page de connexion, par exemple ce que Hired - Job Search Marketplace. Job Hunting Simplified! fait pour c'est formulaire d'inscription, voici ce que je l'ai fait jusqu'à présentDevise association polymorphe deux formulaires d'inscription et un formulaire de connexion

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 

société /_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 %> 

Comment puis-je créer ceci, merci d'avance.

Répondre

1

Je ne suis pas sûr d'avoir bien compris votre problème, mais il me semble que vous avez juste besoin de deux pages sign_up différentes puisque pour vous connecter, vous pouvez simplement utiliser le login par défaut de devise.

Je voudrais écrire une coutume RegistrationController et hériter de Devise::RegistrationsController

Vous pourriez avoir vos itinéraires quelque chose de configuration comme ceci:

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 

Et vous pourriez créer votre registrations_controller comme celui-ci

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


    def create_employer 
    # write your logic here 
    end 
end