13 votes

Pourquoi Rails before_filter est-il appelé deux fois lorsque le contrôleur est sous-classé ?

Je suis à Rails 2.3.5 et j'ai ce problème :

class BaseController < ApplicationController
  before_filter :foo, :only => [:index]
end

class ChildController < BaseController
  before_filter :foo, :only => [:index, :show, :other, :actions]
end

Le problème est que dans ChildController, le filtre :foo before est appelé deux fois.

J'ai essayé un certain nombre de solutions pour contourner ce problème. Si je n'inclus pas le :index dans l'enfant, il ne sera jamais appelé pour cette action.

La solution que j'ai trouvée fonctionne, mais je pense qu'elle est très très moche.

skip_before_filter :foo
before_filter :foo, :only => [:index, :show, :other, :actions]

Y a-t-il une meilleure façon de résoudre ce problème ?

15voto

Roadmaster Points 3533

"Ce comportement est délibéré".

Le guide Rails sur les états des contrôleurs :

"Les filtres sont hérités, donc si vous définissez un filtre sur ApplicationController, il sera exécuté sur chaque contrôleur de votre application."

Cela explique le comportement que vous observez. Il suggère également la même solution que vous proposez (utilisation de skip_before_filter) pour définir les filtres qui seront ou non exécutés pour un contrôleur et/ou des méthodes particuliers.

Donc, moche ou pas, il semble que la solution que vous avez trouvée soit une pratique courante et approuvée.

http://guides.rubyonrails.org/action_controller_overview.html#filters

3voto

Tomas Markauskas Points 6505

Si vous ne voulez pas utiliser skip_before_filter vous pouvez toujours sauter l'étape index l'action dans le ChildController :

class ChildController < BaseController
  before_filter :foo, :only => [:show, :other, :actions]
end

Mais cela pourrait devenir un problème si vous changez le comportement dans BaseController et retirer le filtre du index action. Alors on ne l'appellerait jamais ainsi en utilisant skip_before_filter pourrait être une meilleure idée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X