13

Ich bin auf Rails 2.3.5 und ich habe dieses Problem:Warum wird Rails before_filter zweimal aufgerufen, wenn der Controller unterklassifiziert ist?

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

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

Das Problem ist, dass auf ChildController, die: foo vor Filter zweimal aufgerufen wird.

Ich habe eine Reihe von Problemumgehungen für dieses Problem versucht. Wenn ich die Aktion :index nicht in das Kind einbeziehe, wird sie nie für diese Aktion aufgerufen.

Die Lösung fand ich funktioniert, aber ich denke, es ist sehr, sehr hässlich

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

Gibt es einen besseren Weg, um dieses Problem zu lösen?

Antwort

15

"Dieses Verhalten ist von Entwurf".

Die Rails Führung auf Controller heißt es:

„Filter vererbt werden, also, wenn Sie einen Filter auf Application gesetzt ist, wird es auf jedem Controller in Ihrer Anwendung ausgeführt werden“

Dies erklärt das Verhalten, das Sie sehen. Es schlägt auch genau die gleiche Lösung vor, die Sie vorschlagen (mit skip_before_filter), um zu definieren, welche Filter für einen bestimmten Controller und/oder Methoden ausgeführt werden sollen oder nicht.

Also, hässlich oder nicht, scheint wie die Lösung, die Sie gefunden haben, ist üblich und bewährte Praxis.

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

3

Wenn Sie wollen immer die index Aktion im ChildController überspringen konnte nicht skip_before_filter verwenden:

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

Aber das könnte ein Problem werden, wenn Sie das Verhalten in BaseController ändern und Entfernen Sie den Filter aus der index Aktion. Dann würde es nie aufgerufen werden, also könnte die Verwendung von skip_before_filter eine bessere Idee sein.

Verwandte Themen