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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top