Порядок before_filters в контроллере Rails и проблем

У меня есть проблема Rails, определенная следующим образом:

module MyConcern
  extend ActiveSupport::Concern

  included do
    before_filter :filter_inside_concern
  end

  def filter_inside_concern
    # ...
  end
end

и у меня есть before_filter также на уровне контроллера:

class MyController < ApplicationController
  before_filter :filter_inside_controller
end

Если я включу MyConcern внутри MyController, зависит ли порядок, в котором называются фильтры before, от того, как устроен код? Например, если у нас есть

class MyController < ApplicationController
  include MyConcern

  before_filter :filter_inside_controller
end

Есть ли filter_inside_concern вызывается раньше filter_inside_controller (или наоборот)?

Спасибо!

2 ответа

Решение

Я воссоздал вашу ситуацию и выяснил, последовательность выполнения зависит от последовательности, в которой вы пишете оба фильтра.

если ты пишешь

  include MyConcern
  before_filter :filter_inside_controller

Фильтр концерна будет выполняться первым

или если вы пишете фильтры в этой последовательности

  before_filter :filter_inside_controller
  include MyConcern

фильтр контроллера будет выполняться первым

Если вы используете:

class MyController < ApplicationController
  include MyConcern

  before_filter :filter_inside_controller
end

filter_inside_concern позвонят раньше filter_inside_controller

Если вы хотите иметь filter_inside_controller звонил раньше filter_inside_concernнужно использовать prepend_before_filter вместо:

class MyController < ApplicationController
  include MyConcern

  prepend_before_filter :filter_inside_controller
end

Как примечание стороны, before_filter а также prepend_before_filter будет устаревшим Вы должны использовать before_action а также prepend_before_action вместо.