3

Ich versuche, meine Authentifizierung/Berechtigungen Code ein wenig prägnanter zu machen.Wie kann ich eine before_filter-Funktion je nach Aktion unterschiedlich verhalten?

Zur Zeit habe ich dies:

def index 
     require_role "normal" do 
      @projects = Project.all 
      respond_to do |format| 
       format.html 
      end 
     end 
    end 

wo require_role Griffe Berechtigungen und Umleitung auf eine Fehlerseite zu überprüfen, ob Sie versuchen, nicht etwas, das Sie sollten zu tun.

Ich möchte in der Lage sein, genau wie dieser von jedem Controller an der Spitze etwas zu setzen:

require_role "admin", [:delete] 
require_role "normal", [:edit, :new, :create] 
require_role "guest", [:show, :index] 

definierte so etwas wie:

def self.require_perm(role_name, actions) 
    before_filter :require_perm_admin, :only => actions 
end 

Das einzige Problem ist, dass ich zu Hard-Code den Namen der Methode, require_perm_admin. Das heißt, wenn ich neue Rollen hinzufügen würde, müsste ich für jede eine Methode definieren.

Ist es möglich, dynamisch benannte Methoden zu einer Klasse hinzuzufügen? z.B. "check_role_admin", "check_role_guest" etc.

Kann ich sonst sagen, welche Aktion innerhalb meiner before_filter Funktion aufgerufen werden soll?

Antwort

2

Wenn Sie nur den aktuellen Aktionsnamen haben möchten, können Sie action_name im before_filter anrufen. Ich werde den Rest auf Sie verlassen, wenn das alles ist, Sie denken, Sie brauchen :)

+0

Perfect! Wo ist dieses Zeug dokumentiert? Ich scheine eine Menge Zeit damit zu verbringen, nur zu suchen und nie zu finden ... –

+0

Sie machen einen guten Punkt: Ich weiß nicht, ob es ist. Es ist eine geschützte Instanzvariable, also glaube ich nicht, dass es sogar in der API-Dokumentation ist :( –

+0

Eigentlich ist es hier dokumentiert: http://guides.rubyonrails.org/action_controller_overview.html#routing-parameters –

1

Warum nicht so etwas wie

def self.require_perm(role_name, actions) 
    before_filter "require_perm_#{role_name}".to_sym, :only => actions 
end 
+0

Das funktioniert zu setzen up den Filter, aber Sie müssen die Funktion irgendwie definieren.Ich sehe nicht, wie Sie die Funktion dynamisch definieren, ohne alle Rollen im Voraus zu kennen. –

Verwandte Themen