2010-03-05 5 views
57

Les noms et les objets ont été simplifiés 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 qui authentifie un utilisateur en tant que tel:Ignorer before_filter dans Rails

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 (sauter 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. Ajoutant :except => :show dans le contrôleur animal non seulement passera l'authentification pour l'action show de dog, mais aussi celle de cat et horse. Ce comportement n'est pas souhaité.

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

Répondre

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

Voir ActionController::Filters::ClassMethods pour plus d'informations sur les filtres et héritage.

+2

'skip_before_filter' semble être dépréciée >> [http://apidock.com/rails/ActionController/Filters/ClassMethods/skip_before_filter#1083-deprecated-moved](http://apidock.com/rails/ActionController/ Filters/ClassMethods/skip_before_filter # 1083-deprecated-moved) Ils recommandent d'utiliser 'skip_filter' qui appelle' skip_before_filter', 'skip_after_filter' et' skip_around_filter' tous ensemble. – Bachet

+4

non n'est pas .. ils ne font que déplacer la méthode vers une autre classe, http://apidock.com/rails/v3.2.3/AbstractController/Callbacks/ClassMethods/skip_before_filter – Orlando

+0

oui il a été déplacé –

3

Pour cela, vous pouvez utiliser skip_before_filter

Il est expliqué dans le Rails API

Dans votre exemple dog juste devrait contenir

skip_before_filter :authenticate 
12

Les deux réponses données sont à moitié droites. 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 
2

Juste une petite mise à jour en utilisant des rails 4, il est maintenant skip_before_action :authenticate, :only => :show et que before_filters devrait maintenant utiliser before_action à la place.

+0

Cela devrait être un commentaire. – dan

Questions connexes