Какой порядок выполняется перед фильтрами?
Какой порядок выполняется перед фильтрами? В частности, в каком порядке применяются фильтры before_action в отношении бездействия? Например, будет ли это работать:
class A < ActionController::Base
before_action :set_user
def set_user
@user = something
end
end
class B < A
before_action :set_post
def show
render @post
end
def set_post
@post = @user.posts.first
end
end
Будет ли работать "B # show"? Каковы правила для порядка фильтрации для справок в будущем? Я не могу найти ни одного из них в документации Rails.
Ответы
Ответ 1
Я предлагаю взглянуть на исходный код и Документы API в фильтрах.
Заказ по умолчанию должен быть
Я думаю, что если вы хотите нажать :set_user
в верхнюю часть стека, вы можете изменить строку в A
на
prepend_before_action :set_user
Также стоит отметить, что это не единственный вопрос на эту тему; есть другие здесь, на SO.
Что касается вашей конкретной ситуации, похоже, вам нужно будет изменить A
, как я упоминал выше, чтобы присвоить @user
по истечении времени set_post
в B
.
Начиная с версии 4.2.6 (возможно, измененной в более ранней версии), упорядочение теперь является родительским до дочернего:
Ответ 2
Принятый ответ более не верен, чем Rails 4.2.6. Вероятно, это было изменено ранее, но версия, на которой я сейчас работаю.
Фильтры родительских фильтров теперь вызывается перед дочерними фильтрами, поэтому порядок теперь будет:
И, если вы думаете об этом, этот порядок действительно имеет больше смысла. Как уже говорилось, если вам нужно, чтобы ребенок вызывал фильтр перед родителем, вам нужно использовать prepend_before_action
.
Ответ 3
Да, ваш код будет работать по назначению.
До_фильтров производного класса (B) вызывается перед before_filters в базовом классе (A). Таким образом, порядок названных методов:
- set_user()
- set_post()
- показать()
Также обратите внимание: after_filters вызывается в обратном порядке, наиболее выведенный первым.