Passer before_filter dans Rails
-
24-09-2019 - |
Question
Les noms et les objets ont été simplifiées pour des raisons de clarté. Le concept de base reste le même.
J'ai trois contrôleurs: dog
, cat
et horse
.
Ces contrôleurs héritent tous du contrôleur animal
.
Dans le contrôleur animal
, j'ai un filtre avant que authentifie un utilisateur en tant que tel:
before_filter :authenticate
def authenticate
authenticate_or_request_with_http_basic do |name, password|
name == "foo" && password == "bar"
end
end
Dans l'action show
de dog
, je dois avoir un accès libre à tous les utilisateurs (ignorer l'authentification).
Si je devais écrire l'authentification séparément pour dog
, je pouvais faire quelque chose comme ceci:
before_filter :authenticate, :except => :show
Mais depuis dog
hérite de animal
, je n'ai pas accès aux actions spécifiques au contrôleur. Ajout :except => :show
dans le contrôleur de animal
non seulement ignorer l'authentification pour l'action show
de dog
, mais aussi celle de cat
et horse
. Ce comportement est pas souhaité.
Comment puis-je ignorer l'authentification que pour l'action show
de dog
tout en héritant encore de animal
?
La solution
class Dog < Animal
skip_before_filter :authenticate, :only => :show
end
Voir ActionController :: Filtres :: classmethods pour plus d'informations sur les filtres et l'héritage.
Autres conseils
Les deux réponses sont la moitié droite. Afin d'éviter de faire toutes vos actions de chien ouvert, vous devez qualifier le skip_before_filter d'appliquer seulement à l'action « show » comme suit:
class Dog < Animal
skip_before_filter :authenticate, :only => :show
end
Pour cela, vous pouvez utiliser skip_before_filter
Il est expliqué dans le API Rails
Dans votre exemple serait dog
just doivent contenir
skip_before_filter :authenticate
Juste une petite mise à jour en utilisant des rails 4, il est skip_before_action :authenticate, :only => :show
maintenant et que before_filters doit maintenant utiliser before_action
à la place.