ich versuche eine Schraube mit einem Hammer zu fahren?
Er, vielleicht ;-)
Wenn ich das richtig bin zu lesen, haben Sie eine Situation, in der Aktionen innerhalb eines Controller unterschiedliche Zugriffsebenen haben, so sollten Sie die Vervielfältigung entfernen, indem eine einzelne Prüfung zu schaffen Funktion?
Sie suchen also etwas wie das?
before_filter :check_role('admin'), :only => [:admin, :debug]
before_filter :check_role('power'), :only => [:edit, :delete]
Aber der Parameter in Parens Sache ist nicht legal. Und trotzdem sehe ich hier immer noch ein bisschen Duplikation!
Im Allgemeinen, mit einem Bereich der Funktionalität so gut besucht wie Controller-Filter, wenn Sie etwas nicht tun können, ist es wahrscheinlich, weil Sie etwas auf die falsche Art betrachten. (Denken Sie daran, dass Rails sich stolz als "eigensinnige Software" bezeichnet!)
Wie wäre es, wenn Sie den Aktionsnamen in Ihrer Filtermethode kennen könnten?
Dann würden wir
before_filter :check_role
haben, die ziemlich DRY ist.
Wir konnten Berechtigungen in einem Hash definieren, vielleicht:
Perms = { :admin => ['admin'], :edit => ['admin', 'power'], etc
... die scheinen die unterschiedlichen Elemente der Vervielfältigung zu verkapseln. Wenn es komplex wird, kann das Ganze in eine Tabelle verschoben werden, obwohl du wahrscheinlich die Funktionalität duplizierst, die bereits in einem Plugin verfügbar ist.
Und wir würden haben
protected
def check_role
for required_role in Perms[params[:action]]
return if logged_in_user.has_role? required_role
end
flash[:notice] = 'Access to that area requires additional privileges.'
redirect_to :back
end
oder etwas ähnliches. params [: action] funktioniert auf meiner aktuellen Rails-Version (2.1.2), obwohl das Rails-Buch (v2) eine action_name
-Methode erwähnt, die für mich leer zu sein scheint.
finden Wo der Wert der „Controller“ param gesetzt werden? – Ethan
before_filter liefert das Controller-Objekt für den Block. Wenn Sie mit dem Blockformat von Ruby nicht vertraut sind, begrenzen die Pipes (d. H. ||) einen Parameter, der an den Block übergeben wird. (FYI, Sie könnten den Parameter nennen, was auch immer Sie hier wollen; ich nannte es "Controller", um klar zu sein, was übertragen wird) –
Es funktioniert. Vielen Dank. – Ethan