0

Я беспокойство Рельсы определяется следующим образом:порядок before_filters в контроллере 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 (или наоборот)?

Спасибо!

+0

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

ответ

1

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

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

include MyConcern 
    before_filter :filter_inside_controller 

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

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

before_filter :filter_inside_controller 
    include MyConcern 

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

+0

Это то, чего я ожидал бы интуитивно, но раньше я встречал странные результаты с такого рода вещами, и это всегда стоит проверять посредством ведения журнала. –

+0

Я проверил его с помощью журнала и получил эти результаты. когда мы включаем проблему, она вводит «включенную» часть кода, где мы пишем 'include'. Приоритет фильтра сверху вниз, фильтр сверху сверху выполняется первым. –

+0

Я уверен, что мой комментарий был адресован плакату. –

0

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

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.

 Смежные вопросы

  • Нет связанных вопросов^_^