13

Sono in Rails 2.3.5 e ho questo problema:Perché Rails before_filter viene chiamato due volte quando il controller è sottoclasse?

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 per aggirare questo problema. Se non includo l'azione :index nel figlio, non viene mai chiamata 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?

risposta

15

"Questo comportamento è di progettazione".

La guida Rails su controller afferma:

"I filtri sono 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 soluzione che proponi (utilizzando skip_before_filter) per definire quali filtri saranno o non verranno eseguiti per un particolare controller e/o metodi.

Quindi, brutto o no, sembra che la soluzione che hai trovato sia una pratica comune e approvata.

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

3

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. Quindi non verrebbe mai chiamato così usando skip_before_filter potrebbe essere un'idea migliore.

Problemi correlati