with tutorial framework español djangoproject desde con cero applications ruby-on-rails ruby inheritance order before-filter

ruby-on-rails - framework - tutorial django



¿Qué orden hacer antes de que aparezcan los filtros? (3)

La respuesta aceptada ya no es cierta a partir de Rails 4.2.6. Probablemente fue cambiado antes, pero esa es la versión en la que estoy ahora.

Los filtros principales ahora se llaman antes que los secundarios, por lo que el ordenamiento será ahora:

  1. :set_user
  2. :set_post

Y, si lo piensas, ese orden realmente tiene más sentido. Como se dijo anteriormente, si necesita que el niño llame al filtro antes que el padre, necesita usar prepend_before_action .

¿Qué orden hacer antes de que aparezcan los filtros? Específicamente, ¿en qué orden se encuentran los filtros before_action, en relación con el espíritu? Por ejemplo, funcionará esto:

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

¿Funcionará "B # show"? ¿Cuáles son las reglas para el orden del filtro para futuras referencias? No puedo encontrar nada de esto en la documentación de Rails.


Sí, su código funcionará según lo previsto.

Los before_filters en la clase derivada (B) se llaman antes que before_filters en la clase base (A). Así que el orden de los métodos llamados son:

  1. set_user ()
  2. set_post ()
  3. espectáculo()

También tenga en cuenta que los after_filters se llaman en orden inverso, el más derivado primero.


Sugiero echar un vistazo al código fuente y los documentos API en los filtros.

El orden predeterminado debe ser

  1. :set_post
  2. :set_user

Creo que si quisieras empujar :set_user a la parte superior de la pila, podrías cambiar la línea de A a

prepend_before_action :set_user

También vale la pena señalar, esta no es la única pregunta sobre el tema; hay otros aquí en SO .

En cuanto a su situación específica, parece que tendrá que cambiar A como mencioné anteriormente para que se asigne set_post en el momento en que set_post en B ejecute.

A partir de 4.2.6 (probablemente cambiado en una versión anterior), el ordenamiento ahora es padre antes que hijo:

  1. :set_user
  2. :set_post