Есть ли способ заставить before_filter всегда выполняться последним? - PullRequest
6 голосов
/ 13 июля 2009

Я бы хотел определить before_filter в контроллере, но всегда выполнять его последним.

Я знаю о append_before_filter, но я бы хотел указать этот фильтр в модуле, где другие классы могут позже добавить другие before_filters.

Есть ли способ сделать это?

Ответы [ 4 ]

3 голосов
/ 24 июля 2009

Вот простой модуль, который позволяет выполнять произвольный код после полного набора before_filters. Проделав небольшую работу, вы, вероятно, могли бы это почистить, чтобы здесь выполнялась специальная очередь after_before_filters (с соответствующим поведением остановки и т. Д.).

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

Обратите внимание, что вы должны быть осторожны с этим, так как сами контроллеры могут делать предположения о порядке фильтрации на основе порядка объявления.

2 голосов
/ 15 июля 2009

Вы можете переопределить before_filter в своем модуле или сделать так, чтобы ловушка обратного вызова self.included объявила alias_method_chain :before_filter, :final_filter. Это не рекомендуется для кода, который вы хотели бы переносить на несколько версий Rails, или когда вы будете выпускать код для использования в других контекстах.

2 голосов
/ 13 июля 2009

Я не знаю элегантного способа добиться этого. Однако, немного подумав ... вы можете убедиться, что все ваши контроллеры используют prepend_before_filter. Таким образом, если ваш модуль использует before_filter, вы будете знать, что он всегда будет последним фильтром, потому что контроллеры всегда будут добавлять свои фильтры в начало цепочки фильтров.

1 голос
/ 13 июля 2009

Согласно API rails, по умолчанию "before_filter" является псевдонимом для "append_before_filter", который добавляет фильтры в конец списка filter_chain. Я бы сказал, что есть разумное предположение, что если вы правильно упорядочите свои фильтры в контроллере, они будут выполнены в том порядке, в котором они перечислены. Как и в предыдущем ответе, есть также «prepend_before_filter», который гарантирует, что добавляемый вами фильтр находится в передней части filter_chain.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...