web-dev-qa-db-fra.com

Comment puis-je exécuter une action before_action sur tous les contrôleurs et toutes les actions sauf une?

J'ai une Rails 4.2.x app, avec dispositif d'authentification - j'ai plusieurs contrôleurs.

Je veux le modèle authenticate_user! à exécuter sur tous les contrôleurs et actions sauf sur l'action d'index du contrôleur domestique. (Bien sûr, authenticate_user! Lui-même prend soin de concevoir des actions comme la connexion)

Je peux m'assurer que chaque action du contrôleur exécute l'action before_action dans application_controller.rb:

class ApplicationController < ActionController::Base
  before_action :authenticate_user!
  ...
end

Je peux également restreindre un ensemble spécifique d'actions sur les contrôleurs all:

class ApplicationController < ActionController::Base
  before_action :authenticate_user!, except: [:index]
  ...
end

Mais je ne vois pas comment faire juste home/index pour être une exception.

Je pourrais bien sûr ajouter manuellement before_action :authenticate_user! à chaque contrôleur et ajoutez une exception au contrôleur principal pour l'action d'indexation. Mais ce n'est pas très sec, et si j'ajoute de nouveaux contrôleurs, je dois me rappeler d'ajouter ceci avant_action à chacun d'eux.

26
Anand

Ce que vous devez faire est de définir autheticate_user! sur tous les contrôleurs comme ça:

class ApplicationController < ActionController::Base
  before_action :authenticate_user!
  ...
end

Et puis sur votre HomeController vous faites cela:

class HomeController < ApplicationController
  skip_before_action :authenticate_user!, only: [:index]
  ...
end

J'espère que ceci vous aidera !

48
I'm_ADR