Frage Wie kann ich den Home-Pfad (root) eines Benutzers basierend auf seiner Rolle mithilfe von Devise umleiten?


Ich arbeite an einer Projektmanagement-App und in der App habe ich Projektmanager und Kunden. Ich verwende Devise und CanCan zur Authentifizierung / Autorisierung.

An welchem ​​Punkt nach der Anmeldung sollte ich den Benutzer zu seinem eigenen spezifischen Controller / Layout / Ansichten umleiten? Gibt es eine Möglichkeit zu überprüfen? current_user.role im routes.rb und legen Sie die Root (oder Redirect) basierend darauf fest, ob sie ein Projektmanager oder ein Client sind? Kann ich das irgendwo in Devise ändern?

Vielen Dank im Voraus für jede Hilfe! --Kennzeichen


23
2018-01-20 23:28


Ursprung


Antworten:


Ihre routes.rb Die Datei hat keine Ahnung, welche Rolle der Benutzer hat, daher können Sie keine spezifischen Root-Routen zuweisen.

Sie können einen Controller einrichten (z. B. passthrough_controller.rb), die wiederum die Rolle lesen und umleiten können. Etwas wie das:

# passthrough_controller.rb
class PassthroughController < ApplicationController
  def index
    path = case current_user.role
      when 'project_manager'
        some_path
      when 'client'
        some_other_path
      else
        # If you want to raise an exception or have a default root for users without roles
    end

    redirect_to path     
  end
end

# routes.rb
root :to => 'passthrough#index'

Auf diese Weise haben alle Benutzer einen Einstiegspunkt, der sie je nach ihrer Rolle an den entsprechenden Controller / Vorgang weiterleitet.


35
2018-01-20 23:36



Die einfachste Lösung ist zu verwenden lambda:

root :to => 'project_managers#index', :constraints => lambda { |request| request.env['warden'].user.role == 'project_manager' }
root :to => 'clients#index'

15
2017-08-03 11:14



Eine andere Möglichkeit besteht darin, einen Proc an die authenticated Methode wie folgt (ich verwende in diesem Beispiel rolify):

authenticated :user, ->(u) { u.has_role?(:manager) } do
  root to: "managers#index", as: :manager_root
end

authenticated :user, ->(u) { u.has_role?(:employee) } do
  root to: "employees#index", as: :employee_root
end

root to: "landing_page#index"

Beachten Sie, dass Sie in Rails 4 haben um einen eindeutigen Namen für jede Root-Route anzugeben, siehe dieses Problem für Details.


11
2018-02-02 17:14



Ich mache das in einer Rails 3 App, die Warden verwendet. Da Devise auf Warden aufgebaut ist, denke ich, dass es für Sie funktionieren wird, aber seien Sie sicher, dass Sie etwas damit experimentieren, bevor Sie sich darauf verlassen.

class ProjectManagerChecker
  def self.matches?(request)
    request.env['warden'].user.role == 'project_manager'
  end
end

# routes.rb
get  '/' => 'project_managers#index', :constraints => ProjectManagerChecker
get  '/' => 'clients#index'

Wenn die Rolle des Benutzers "project_manager" ist, wird der ProjectManagersController verwendet - wenn nicht der ClientController verwendet wird. Wenn sie überhaupt nicht eingeloggt sind, env['warden'].user wird null sein und du wirst einen Fehler bekommen, also wirst du das wahrscheinlich umgehen wollen, aber das wird dich weiterbringen.


6
2018-01-21 00:02



Blogpost mit der Implementierung http://minhajuddin.com/2011/10/24/how-to-change-the-rails-root-url-based-on-the-user-or-role/


3
2017-10-24 09:40