sto provando a guidare una vite con un martello ?
Er, forse ;-)
Se sto leggendo correttamente, si ha una situazione in cui le azioni di uno di controllo hanno diversi livelli di accesso, in modo che si desidera rimuovere la duplicazione con la creazione di un unico controllo funzione?
Quindi stai cercando di fare qualcosa del genere?
before_filter :check_role('admin'), :only => [:admin, :debug]
before_filter :check_role('power'), :only => [:edit, :delete]
Ma il parametro nella cosa paren non è legale. E comunque, vedo ancora un bel po 'di duplicazione qui!
In generale, con un'area di funzionalità ben vista come i filtri del controller, se non si può fare qualcosa, è probabilmente perché si sta guardando qualcosa nel modo sbagliato. (Ricorda che Rails è orgoglioso di descrivere se stesso come "software supponente"!)
Come sarebbe se tu fossi in grado di conoscere il nome dell'azione nel tuo metodo di filtro?
Poi avremmo
before_filter :check_role
che è abbastanza DRY.
Potremmo definire i permessi in un hash, forse:
Perms = { :admin => ['admin'], :edit => ['admin', 'power'], etc
... che sembrano racchiudere gli elementi distinti della duplicazione. Se diventasse complesso, l'intera cosa potrebbe spostarsi in una tabella, anche se probabilmente stai duplicando funzionalità già disponibili in un plug-in.
E avremmo
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
o qualcosa di simile. params [: action] funziona sulla mia attuale versione di Rails (2.1.2), sebbene il libro Rails (v2) menzioni un metodo action_name
che sembra non restituire per me.
Da dove viene il valore del "controller" param Get Set? – Ethan
before_filter restituirà l'oggetto controller al blocco. Se non si ha familiarità con il formato di blocco di Ruby, le pipe (ad es. ||) delimitano un parametro che viene passato al blocco. (FYI, puoi nominare il parametro come vuoi, ho chiamato "controller" per essere chiaro su cosa viene passato) –
Funziona. Grazie. – Ethan