13

Estoy en Rails 2.3.5 y tengo este problema:¿Por qué Rails before_filter se llama dos veces cuando el controlador está subclasificado?

class BaseController < ApplicationController 
    before_filter :foo, :only => [:index] 
end 

class ChildController < BaseController 
    before_filter :foo, :only => [:index, :show, :other, :actions] 
end 

El problema es que en ChildController, el: foo antes de filtro se llama dos veces.

He intentado una serie de soluciones para este problema. Si no incluyo la acción :index en el niño, nunca se llama para esa acción.

La solución que encontraron trabajos, pero creo que es muy, muy fea

skip_before_filter :foo 
before_filter :foo, :only => [:index, :show, :other, :actions] 

¿Hay una mejor manera de resolver este problema?

Respuesta

15

"Este comportamiento es por diseño".

los carriles de guía en los controladores afirma:

"Los filtros se heredan, por lo que si se establece un filtro en ApplicationController, que se llevará a cabo en todos los controladores en su aplicación"

Esto explica el comportamiento que estás viendo. También sugiere la misma solución exacta que usted propone (usando skip_before_filter) para definir qué filtros se ejecutarán o no para un controlador y/o métodos en particular.

Así que, feo o no, parece que la solución que encontró es práctica común y aprobada.

http://guides.rubyonrails.org/action_controller_overview.html#filters

3

Si no desea utilizar skip_before_filter siempre se puede omitir la acción index en el ChildController:

class ChildController < BaseController 
    before_filter :foo, :only => [:show, :other, :actions] 
end 

pero esto podría convertirse en un problema si cambia el comportamiento en BaseController y eliminar el filtro de la acción index. Entonces nunca se llamaría, así que usar skip_before_filter podría ser una mejor idea.

Cuestiones relacionadas