rotaie: mettere e interruzione del filtro prima
-
18-09-2019 - |
Domanda
Voglio una prima del filtro come "must_have_permission_to_write" che quando viene chiamato se utente non ha il permesso di scrivere rende un messaggio che dice "non puoi farlo!" e ritorno.
Il problema è che sto ottenendo "non può che rendere o reindirizzare una volta per ogni azione", naturalmente ... come posso fermare l'esecuzione nel filtro prima? grazie
Soluzione
Penso che la risposta più semplice è aggiungere un reindirizzamento e restituire false per il metodo di must_have_permission_to_write
.
def must_have_permission_to_write
unless current_user.has_permission?(something)
redirect_to access_denied_path
return false
end
end
Quindi, creare un'azione per l'accesso negato da qualche parte, aggiungere il percorso, e mettere quello che vuoi nel modello.
Altri suggerimenti
Ci sono alcune cose che ho notato circa i posti qui:
- Chiamare il rendering o reindirizzare in un filtro prima si annulla l'azione. C'è stato un momento in cui le rotaie non hanno fatto questo, ma per quanto ne so, questo è automatico ora. Io non riesco a trovare un riferimento alla presente on-line, per favore qualcuno mi corregga se sbaglio.
- Uso di "andata e ritorno" è un ottimo modo per annullare l'azione se si è in realtà dentro l'azione. Negli esempi sopra i metodi sono definiti come prima filtro (cioè metodi separate) chiamata "e di ritorno" alla fine di un metodo, non è che utile.
- Non credo che si dovrebbe dire a qualcuno "non si può fare che", non è questo è una pratica molto sicuro. Se qualcuno chiede per qualcosa che non hanno il permesso di, la risposta dovrebbe essere 404. Rispondendo del genere si stanno dando questa persona "curiosa" troppe informazioni.
È sufficiente aggiungere il and return
, come fare:
before_filter :must_have_permission_to_write
def must_have_permission_to_write
redirect_to login_path and return unless current_user
end