порядок 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, будет ли порядок, в котором вызываются фильтры до, зависеть от того, как устроен код? Например, если у нас есть

class MyController < ApplicationController
  include MyConcern

  before_filter :filter_inside_controller
end

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

Благодарю вас!


person Adler Santos    schedule 05.01.2016    source источник
comment
Я думаю, вы можете определить это самостоятельно, добавив код журнала в оба фильтра, и вы сможете увидеть последовательность, в которой он вызывается. Дать ему шанс.   -  person Pardeep Dhingra    schedule 05.01.2016


Ответы (2)


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

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

  include MyConcern
  before_filter :filter_inside_controller

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

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

  before_filter :filter_inside_controller
  include MyConcern

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

person Asad Ali    schedule 05.01.2016
comment
Это то, чего я ожидал интуитивно, но я уже находил странные результаты с подобными вещами, и это всегда стоит проверить с помощью журнала. - person Max Williams; 05.01.2016
comment
Я проверил это через регистрацию и получил эти результаты. когда мы включаем беспокойство, он внедряет included часть кода, где мы пишем include. Приоритет фильтра сверху вниз, какой фильтр сверху выполняется первым. - person Asad Ali; 05.01.2016
comment
Я уверен, что мой комментарий действительно был адресован постеру. - person Max Williams; 05.01.2016

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

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.

person Edmond Chui    schedule 30.01.2016