Perché è Rails before_filter chiamato due volte quando il controller è una sottoclasse?
-
04-10-2019 - |
Domanda
Sono in Rails 2.3.5 e ho questo problema:
class BaseController < ApplicationController
before_filter :foo, :only => [:index]
end
class ChildController < BaseController
before_filter :foo, :only => [:index, :show, :other, :actions]
end
Il problema è che sul ChildController, il:. Foo prima del filtro viene chiamato due volte
Ho provato una serie di soluzioni alternative per aggirare questo problema. Se non includere l'azione :index
nel bambino, non viene mai chiamato per quell'azione.
La soluzione che ho trovato le opere, ma penso che sia molto molto brutto
skip_before_filter :foo
before_filter :foo, :only => [:index, :show, :other, :actions]
C'è un modo migliore per risolvere questo problema?
Soluzione
"Questo comportamento legato alla progettazione".
La guida Rails su controller stati:
"I filtri vengono ereditati, quindi se si imposta un filtro su ApplicationController, verrà eseguito su ogni controller nell'applicazione".
Questo spiega il comportamento che stai vedendo. Suggerisce anche la stessa esatta soluzione si propone (utilizzando skip_before_filter) per definire quali filtri sarà o non essere eseguito per un determinato controller e / o metodi.
Quindi, brutto o no, sembra la soluzione che avete trovato è pratica comune e approvato.
http://guides.rubyonrails.org/action_controller_overview.html#filters
Altri suggerimenti
Se non si desidera utilizzare skip_before_filter
si può sempre saltare l'azione index
nella ChildController
:
class ChildController < BaseController
before_filter :foo, :only => [:show, :other, :actions]
end
Ma questo potrebbe diventare un problema se si modifica il comportamento in BaseController
e rimuovere il filtro dall'azione index
. Allora non sarebbe mai stato chiamato in modo da utilizzare skip_before_filter
potrebbe essere un'idea migliore.