Ich erstelle eine Bewerbung für eine Jobbörse. Ich bin neu in der Programmierung und bringe mir das Rails-Framework bei.

Ich verwende Devise zur Authentifizierung. Ich werde zwei verschiedene Arten von Benutzern haben; Job Seeker und Employer. Der Arbeitssuchende erstellt ein Profil und sucht nach Stellenausschreibungen. Der Arbeitgeber erstellt ein Unternehmensprofil und veröffentlicht Stellenanzeigen. In Zukunft kann der Arbeitgeber auch nach Mitarbeitern suchen, die auf Qualifikationen, Erfahrungen, Ausbildung usw. basieren. Im Moment baue ich jedoch nur mein MVP auf.

2
Zach Williams 31 Dez. 2015 im 03:47

3 Antworten

Beste Antwort

Diese Art von Funktionalität ist schwierig, da Sie die Funktionalität vor der Implementierung festlegen müssen (IE, die meisten Leute werden wegen Devise aufgehängt, während sie möglicherweise überhaupt nicht funktioniert).


Sie haben zwei Möglichkeiten:

Das Gerät ist ein Authentifizierungssystem (Benutzer angemeldet). Möglicherweise verwenden Sie die Autorisierung besser (kann der Benutzer x oder y ausführen). Die Autorisierung liegt außerhalb des Anwendungsbereichs von Devise.

Sie könnten zwar mehrere Modelle verwenden (Devise), aber ich denke, es verursacht zu viel unnötiges Aufblähen für das, was Sie brauchen.

Stattdessen würde ich ein sehr einfaches Rollensystem verwenden (unter Verwendung von {) {X0}}):

#app/models/user.rb
class User < ActiveRecord::Base
   enum role: [:job_seeker, :employer]

   has_one :profile
   before_create :build_profile

   has_many :applications
   has_many :listings, through: :applications
end

#app/models/application.rb
class Application < ActiveRecord::Base
    belongs_to :listing
    belongs_to :user
end

#app/models/listing.rb
class Listing < ActiveRecord::Base
   has_many :applications
   has_many :applicants, through: :applications, class_name: "User", foreign_key: :user_id
end

Sie müssen Ihrer users Tabelle eine role Spalte (int) hinzufügen. Sie erstellen die Standard -Rolle mithilfe eines default: [x] -Schalters, wenn Sie Ihre Spalte erstellen:

def change
   add_column :users, :role, :integer, default: 0 #-> defaults to job seeker
end

-

Sie haben mehrere Faktoren beschrieben, die sich perfekt dafür eignen:

  • Job seeker erstellt ein Profil
  • Employer erstellt ein Profil und veröffentlicht Einträge

... alles bedeutet, dass Ihr "flow" für beide Benutzertypen ähnlich bleibt. Sie müssen nur verwalten, was jeder Benutzer mit der Autorisierung tun kann.


Konfiguration

#config/routes.rb
resource  :profile, controller: :users, only: [:show, :update] #-> url.com/profile
resources :listings, only: [:show] do
   post :apply, on: :member #-> url.com/listings/:id/apply
end
resources :companies, controller: :users, only: [:show]

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   #show will automatically be loaded

   def update
      current_user.update profile_params
   end

   private

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

#app/views/users/show.html.erb
<%= form_for current_user do |f| %>
   <%= f.fields_for :profile do |p| 
      <% if current_user.job_seeker? %>
         <%= f.text_field :name, placeholder: "Your name" %>
      <% elsif current_user.employer? %>
         <%= f.text_field :name, placeholder: "Company name" %>
      <% end %>
   <% end %>
   <%= f.submit %>
<% end %> 

Sie können dann Folgendes verwenden, um zu überprüfen, ob ein Benutzer Einträge erstellen oder nur anzeigen kann:

#app/controllers/listings_controller.rb
class ListingsController < ApplicationController
   before_action :check_seeker, only: [:apply]
   before_action :check_employer, only: [:new, :create, :destroy]

   def new  #-> employers
      @listing = current_user.listings.new
   end

   def apply #-> job seekers
      @listing     = Listing.find params[:id]
      @application = current_user.applications.new
      @application.listing = @listing
      redirect_to @listing, notice: "Application successful!" if @application.save 
   end

   private

   def check_seeker
      redirect_to listings_path, notice: "Only Job Seekers Allowed" unless current_user.job_seeker?
   end

   def check_employer
      redirect_to root_url, notice: "Only Employers Allowed" unless current_user.employer?
   end
end

Hoffentlich gibt Ihnen dies das Wesentliche.


Entwickeln

Damit Devise mit Ihrer neuen Spalte funktioniert, müssen Sie den Devise Sanitizer erweitern ::

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :role
  end
end

Auf diese Weise können Sie das Feld role bei der Anmeldung ändern:

#app/views/devise/registrations/new.html.erb
.....
  <%= f.select :role, User.roles %>
3
Community 20 Juni 2020 im 09:12

Das Gerät eignet sich gut für die Authentifizierung, aber für die Rollen- und Zugriffskontrolle sollten Sie sich Rolify ansehen: https://github.com/ RolifyCommunity / rolify.

Auf diese Weise können Sie ein einzelnes Benutzermodell beibehalten und den Zugriff auf verschiedene Funktionen mit Rollenabfragen steuern, z.

unless current_user.has_role?(:admin)
  redirect_to ...
else
  render ...
end 
2
errata 31 Dez. 2015 im 05:19

Für Rollen können Sie CanCanCan gem und RoleModel gem mit devise verwenden, was für Benutzer mit unterschiedlichen Rollen besser ist.

CanCanCan

Fähigkeiten mit Cancancan definieren

Vorbild Juwel

Beispiel für Benutzerrollen mit oben genannten Edelsteinen.

1
Gokul M 31 Dez. 2015 im 06:16