Ignorer before_filter dans Rails

Les noms et les objects ont été simplifiés pour plus de clarté. Le concept de base rest le même.

J’ai trois contrôleurs: dog , cat et horse . Ces contrôleurs héritent tous de l’ animal contrôleur. Dans l’ animal contrôleur, j’ai un filtre avant qui 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 de show de dog , je dois avoir un access ouvert à tous les utilisateurs (ignorer l’authentification).

Si je devais écrire l’authentification séparément pour dog , je pourrais faire quelque chose comme ceci:

 before_filter :authenticate, :except => :show 

Mais comme le dog hérite de l’ animal , je n’ai pas access aux actions spécifiques au contrôleur. Ajouter :except => :show dans le contrôleur d’ animal ne sautera pas seulement l’authentification pour l’action de show du dog , mais aussi celle du cat et du horse . Ce comportement n’est pas souhaité.

Comment puis-je ignorer l’authentification uniquement pour l’action show de dog tout en héritant encore de l’ animal ?

 class Dog < Animal skip_before_filter :authenticate, :only => :show end 

Voir ActionController :: Filters :: ClassMethods pour plus d’informations sur les filtres et l’inheritance.

Les deux réponses données sont à moitié correctes. Afin d’éviter que toutes vos actions de chien ne soient ouvertes, vous devez qualifier le skip_before_filter pour qu’il ne s’applique qu’à 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 l’ API Rails

Dans votre exemple, le dog devrait simplement contenir

 skip_before_filter :authenticate 

Juste une petite mise à jour qui utilise les rails 4, c’est maintenant skip_before_action :authenticate, :only => :show et que before_filters devrait maintenant utiliser before_action place.