J'aimerais définir un fichier avant_filter dans un contrôleur, mais toujours l'exécuter en dernier. P>
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. P>
Y a-t-il un moyen de faire cela? p>
4 Réponses :
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 code> . De cette façon, si votre module utilise avant_filter code>, 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. P>
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. P>
vous pouvez remplacer avant_filter code> dans votre module ou avoir le auto. / Code> Callback Crochet Déclarez un alias_method_chain: avant_filter,: final_filter code>. 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. P>
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