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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top