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
?
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.
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
Pour cela, vous pouvez utiliser skip_before_filter
C'est expliqué dans Rails API
Dans votre exemple, dog
just devrait contenir
skip_before_filter :authenticate
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.