Порядок 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
вместо.