web-dev-qa-db-fra.com

Ignorer before_filter dans Rails

Les noms et les objets ont été simplifiés par souci 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:

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, j'ai besoin d'avoir un accès ouvert à tous les utilisateurs (sauter 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 puisque dog hérite de animal, je n'ai pas accès aux actions spécifiques au contrôleur. Ajouter :except => :show dans le contrôleur animal ignorera non seulement l'authentification pour l'action show de dog, mais aussi celle de cat et horse . Ce comportement n'est pas souhaité.

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

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

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

111
Jimmy Cuadra

Les deux réponses données sont à moitié correctes. Afin d'éviter d'ouvrir toutes les actions de votre chien, vous devez qualifier le skip_before_filter pour s'appliquer uniquement à l'action "afficher" comme suit:

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

Pour cela, vous pouvez utiliser skip_before_filter

C'est expliqué dans Rails API

Dans votre exemple, dogjust devrait contenir

skip_before_filter :authenticate
3
ajmurmann

Juste une petite mise à jour qui utilise Rails 4, c'est maintenant skip_before_action :authenticate, :only => :show et que before_filters devrait maintenant utiliser before_action au lieu.

2
Thresh