2016-05-06 2 views
0

Ich arbeite an einer App, in der es ein Modell Benutzer mit Rollen Mitglied und Admin gibt.Bedingte Route auf sign_out mit Devise mit Rails

Je nach Anforderung muss ich zwei separate Login-Seiten für Admin und Mitglied machen.

mit http://localhost:3000/admin/admin_login

es geht zur Admin-Login-Seite und mit

http://localhost:3000/users/sign_in

es geht an Mitglied Login-Seite. Gleich nach dem Login route ich sie entsprechend ihren Rollen an Admin-Panel oder einfache Website für Mitglieder.

Aber zum Zeitpunkt der Abmeldung geht sowohl auf http://localhost:3000

aber ich will admin http://localhost:3000/admin/admin_login gehen, während http://localhost:3000 für Mitglieder logout in Ordnung ist.

Gibt es eine Möglichkeit, die Rolle des Benutzers zur Zeit von Sign_out zu sehen und sie entsprechend zu routen.

+0

Woher wissen Sie, dass der Benutzer Administrator oder Mitglied ist? Haben Sie irgendwelche Attribute in der Datenbank? –

+0

Ich habe rolify gem verwendet. mit current_user.has_role? : Admin, ich kann sie überprüfen, aber wo dies mit dem Gerät –

Antwort

1

Sie definieren können, nachdem sich abzumelden Weg nach Ressource in Anwendungssteuerung ..

class ApplicationController < ActionController::Base 
    private 

    # Overwriting the sign_out redirect path method 
    def after_sign_out_path_for(resource_or_scope) 
    root_path 
    end 
end 

In after_sign_out_for_for Methode Sie Benutzerrolle überprüfen und umleiten zu

Für weitere Informationen besuchen Sie ersinnen Wiki After Sign out path in devise

+0

überprüfen und wie hier die Rolle zu überprüfen, resource.has_role? : Admin gibt Fehler –

+0

Bitte sehen Sie das Argument send an after_sign_out_path_for. 'resource_or_scope' ist die Variable dort. und Sie überprüfen resource.has_role ?. Sie müssen 'resource_or_scope.has_role überprüfen? : Admin'..oder hast du eine Ressource gesetzt? –

+0

nein Ich habe keine resourse gesetzt, lassen Sie mich mit diesem –

1

Ich denke, Sie können so versuchen Speichern Sie einfach den Pfad, den Sie Benutzer nach Sign_out umleiten möchten, basierend auf der Rolle nach dem Login in Sitzung und diese Sitzung in achtern verwenden er_sign_out_path_for Methode

after_filter :store_location 

def store_location 
    return unless session[:login_url].blank? 
    session[:login_url] = current_user.admin? ? admin_path : other_user_path 
end 

def after_sign_out_path_for(resource) 
    session[:login_url] || request.referer || root_path 
end 

gibt es eine andere Art und Weise überschreiben nur sessoin Controller entwickeln und leiten Benutzer von dort basierend auf Rolle

# routes.rb 
devise_for :users, :controllers => { :sessions => "sessions" } # etc 

# sessions_controller.rb 
class SessionsController < Devise::SessionsController 

    def destroy 
    #login_path = set path in a variable based on user role before sing_out 
    #code to sign out 
    # 
    redirect_to login_path 
    end 

end 
+0

Danke Mann, aber ich habe es versucht Art der Lösung, es scheint, dass sie planen, signout alle Sitzungen gelöscht –

+0

Andere Lösung funktioniert für Sie @Shadow Antworten? – Thorin

+0

@shadow Lösung funktioniert für Sie, ich habe nicht getestet meine Lösung nur Code basierend auf dem Wissen hinzugefügt, Ja, Sie haben Recht Gerät entfernen alle Sitzung auf Abmeldung – Thorin

0

die Seiten, die sie auf den Logout-Links unterscheiden sich für Administratoren und Benutzer klicken ? In diesem Fall könnten Sie die request.referrer-Eigenschaft in Ihrer Methode "after_sign_out_path" überprüfen und entsprechend routen.

BTW, wenn Sie sie nach dem Login zu den richtigen Seiten leiten, warum brauchen Sie separate Login-Seiten? Vielleicht möchten Sie einfach eine Login-Seite für die Einfachheit haben.