Подтвердить что ты не робот

Какой порядок выполняется перед фильтрами?

Какой порядок выполняется перед фильтрами? В частности, в каком порядке применяются фильтры 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.

4b9b3361

Ответ 1

Я предлагаю взглянуть на исходный код и Документы API в фильтрах.

Заказ по умолчанию должен быть

  • :set_post
  • :set_user

Я думаю, что если вы хотите нажать :set_user в верхнюю часть стека, вы можете изменить строку в A на

prepend_before_action :set_user

Также стоит отметить, что это не единственный вопрос на эту тему; есть другие здесь, на SO.


Что касается вашей конкретной ситуации, похоже, вам нужно будет изменить A, как я упоминал выше, чтобы присвоить @user по истечении времени set_post в B.


Начиная с версии 4.2.6 (возможно, измененной в более ранней версии), упорядочение теперь является родительским до дочернего:

  • :set_user
  • :set_post

Ответ 2

Принятый ответ более не верен, чем Rails 4.2.6. Вероятно, это было изменено ранее, но версия, на которой я сейчас работаю.

Фильтры родительских фильтров теперь вызывается перед дочерними фильтрами, поэтому порядок теперь будет:

  • :set_user
  • :set_post

И, если вы думаете об этом, этот порядок действительно имеет больше смысла. Как уже говорилось, если вам нужно, чтобы ребенок вызывал фильтр перед родителем, вам нужно использовать prepend_before_action.

Ответ 3

Да, ваш код будет работать по назначению.

До_фильтров производного класса (B) вызывается перед before_filters в базовом классе (A). Таким образом, порядок названных методов:

  • set_user()
  • set_post()
  • показать()

Также обратите внимание: after_filters вызывается в обратном порядке, наиболее выведенный первым.