rails: mettre et interruption avant filtre
-
18-09-2019 - |
Question
Je veux un avant filtre comme « must_have_permission_to_write » que lorsqu'il est appelé si l'utilisateur n'a pas l'autorisation d'écrire rend un message disant: « vous ne pouvez pas faire ça! » et retour.
Le problème est que je reçois « ne peut rendre ou rediriger une fois par action » bien sûr ... comment puis-je arrêter l'exécution dans l'avant filtre? merci
La solution
Je pense que la réponse la plus simple est d'ajouter une redirection et return false à votre méthode 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
Ensuite, créez une action pour refuser l'accès quelque part, ajoutez la route, et mettez tout ce que vous voulez dans le modèle.
Autres conseils
Il y a quelques choses que je remarquai sur les messages ici:
- appellez render ou redirect dans un filtre avant annulerons l'action. Il y avait un moment où les rails ne le font pas, mais pour autant que je sache, c'est automatique maintenant. Je ne peux pas sembler trouver une référence à cette ligne, quelqu'un s'il vous plaît me corriger si je me trompe.
- Utilisation « et le retour » est un excellent moyen d'annuler l'action si vous êtes réellement à l'intérieur de l'action. Dans les exemples ci-dessus les méthodes sont définies en amont du filtre (à savoir des procédés séparés) appelant « et retour » à la fin d'un procédé, est pas utile.
- Je ne pense pas que vous devriez dire à quelqu'un « vous ne pouvez pas le faire », thats pas une pratique très sécuritaire. Si quelqu'un demande quelque chose qu'ils n'ont pas l'autorisation de, la réponse devrait être 404. En répondant comme vous donnez cette personne « curieux » trop d'informations.
Il suffit d'ajouter le and return
, comme faire:
before_filter :must_have_permission_to_write
def must_have_permission_to_write
redirect_to login_path and return unless current_user
end