6
votes

Y a-t-il un moyen de forcer un avant_filter à toujours exécuter le dernier?

J'aimerais définir un fichier avant_filter dans un contrôleur, mais toujours l'exécuter en dernier.

Je connais à propos de append_before_filter, mais je voudrais spécifier ce filtre dans un module, où d'autres classes peuvent également ajouter plus tard d'autres avant_filters.

Y a-t-il un moyen de faire cela?


0 commentaires

4 Réponses :


2
votes

Je ne suis pas au courant d'un moyen élégant d'y parvenir. Cependant, en utilisant un peu de pensée latérale ... Vous pouvez vous assurer que tous vos contrôleurs utilisent PREPEND_BEfore_Filter . De cette façon, si votre module utilise avant_filter , vous saurez qu'il s'agira toujours du dernier filtre car les contrôleurs ajoutent toujours leurs filtres au début de la chaîne de filtrage.


0 commentaires

2
votes

Selon l'API RAILS, la valeur par défaut "avant_filter" est un alias pour "append_before_filter", qui ajoute des filtres à la fin de la liste Filter_CHAIN. Je dirais qu'il existe une hypothèse raisonnable que si vous commandez vos filtres correctement dans le contrôleur, ils seront exécutés afin qu'ils soient répertoriés. Comme la réponse précédente suggère qu'il existe également un "Prevend_Before_filter" qui garantit que le filtre que vous ajoutez est à l'avant du filtre_chain.


0 commentaires

2
votes

vous pouvez remplacer avant_filter dans votre module ou avoir le auto. / Code> Callback Crochet Déclarez un alias_method_chain: avant_filter,: final_filter . Ceci n'est pas recommandé pour le code que vous souhaitez être capable de porter sur plusieurs versions de rails ou lorsque vous publierez le code à utiliser dans d'autres contextes.


0 commentaires

3
votes

Voici un module simple qui permet l'exécution d'un code arbitraire après l'ensemble complet d'avant_filters. Avec un peu de travail, vous pourriez probablement nettoyer cela afin qu'une file d'attente de spécial après_before_filters code> a été exécutée ici (avec un comportement décalé, et ainsi de suite).

module OneLastFilterModule

  def self.included(base)
    base.class_eval do

      def perform_action_without_filters_with_one_last_filter

        #
        # do "final" before_filter work here
        #

        perform_action_without_filters_without_one_last_filter
      end
      alias_method_chain :perform_action_without_filters, :one_last_filter

    end
  end

end


0 commentaires