2016-04-26 5 views
1

Ich habe Sidekiq in meine Routen-Datei an den Endpunkt /sidekiq montiert.Umleiten einer Anfrage in einem Routing-Constraint

Ich verwende eine constraints Option, um eine externe Klasse zur Validierung aufrufen zu lassen, um zu verhindern, dass nicht privilegierte Benutzer auf diesen Endpunkt zugreifen.

# config/routes.rb 
mount Sidekiq::Web => "/sidekiq", constraints: Sidekiq::AdminConstraint.new 

# lib/sidekiq/admin_constraint.rb 
module Sidekiq 
    class AdminConstraint 
    def matches?(request) 
     return false unless request.session[:user_id] 
     user = User.find_by_id(request.session[:user_id]) 
     user && Ability.new(user).can?(:manage, :sidekiq) 
    end 
    end 
end 

Diese Einrichtung funktioniert gut. Allerdings kann ich nur true/false zurückgeben, ob die Anfrage durchlaufen werden soll oder nicht. Es läßt mich nicht -

  1. eine Flash-Mitteilung Stellen (zB „Sie sind nicht die Seite erlauben den Zugriff auf“) und
  2. Redirect zu einer beliebigen Seite

In diesem Sinne, ich Ich suche es sich mehr wie ein Controller before_filter zu verhalten.

Gibt es eine Möglichkeit, das request Objekt zu ändern, das übergeben wird, um diese Umleitung zu implementieren?

Danke!

+1

Diese Antwort war hilfreich hinzu: https: //stackoverflow.com/a/19649787/718180 – vergenzt

Antwort

1

Ich habe keine Idee direkt gesetzt die Flash-Nachrichten, aber wir können auf andere Weise verwenden.

unten Abstimmung akzeptiert rescue_from in Schienen gebrochen 3. nicht sicher, ob es in späteren Versionen behoben wurde

Verwenden Sie die folgende Lösung

In Ihrem routes.rb die folgende Zeile am Ende hinzufügen der Datei

Übereinstimmung "* path",: to => "application # error_404" Dies bedeutet im Grunde, dass jeder Pfad, der nicht in Ihrer Route definiert ist, in Application Controller zu error_404 geht. Es ist sehr wichtig, diese

Und in Ihrem Application am Ende der Datei zu setzen, für mich

def error_404 redirect_to root_path Ende

Dank

Verwandte Themen