2010-03-05 21 views
57

Nazwy i obiekty zostały uproszczone ze względu na przejrzystość. Podstawowa koncepcja pozostaje taka sama.Pomiń przed_filter w szynach

Mam trzy kontrolery: dog, cat i horse. Te kontrolery wszystkie dziedziczą ze sterownika animal. W regulatorze animal, mam przed filtr, który uwierzytelnia użytkownika, takich jak:

before_filter :authenticate 

def authenticate 
    authenticate_or_request_with_http_basic do |name, password| 
    name == "foo" && password == "bar" 
    end 
end 

w akcji dogshow, muszę mieć otwarty dostęp do wszystkich użytkowników (pominąć uwierzytelnianie).

Gdybym miał napisać uwierzytelniania osobno dla dog, mógłby zrobić coś takiego:

before_filter :authenticate, :except => :show 

Ale ponieważ dog dziedziczy z animal, nie mam dostępu do działań kontrolera specyficzne. Dodanie :except => :show w kontrolerze animal spowoduje nie tylko pominięcie uwierzytelniania dla działania show z dog, ale także z cat i . To zachowanie nie jest pożądane.

Jak mogę pominąć uwierzytelnianie tylko dla akcji z dog, nadal dziedzicząc po animal?

Odpowiedz

107
class Dog < Animal 
    skip_before_filter :authenticate, :only => :show 
end 

Zobacz ActionController::Filters::ClassMethods uzyskać więcej informacji na temat filtrów i dziedzictwo.

+2

'skip_before_filter' wydaje się być przestarzałe >> [http://apidock.com/rails/ActionController/Filters/ClassMethods/skip_before_filter#1083-deprecated-moved](http://apidock.com/rails/ActionController/ Filters/ClassMethods/skip_before_filter # 1083-deprecated-moved) Polecają używać 'skip_filter', który wywołuje' skip_before_filter', 'skip_after_filter' i' skip_around_filter' razem. – Bachet

+4

no is not .. po prostu przenoszą tę metodę do innej klasy, http://apidock.com/rails/v3.2.3/AbstractController/Callbacks/ClassMethods/skip_before_filter – Orlando

+0

Tak, został przeniesiony –

3

W tym celu można użyć skip_before_filter

Jest to wyjaśnione w Rails API

W przykładzie dog tylko musiałby zawierać

skip_before_filter :authenticate 
12

Dwie podane odpowiedzi są w połowie poprawne. W celu uniknięcia podejmowania wszystkie twoje działania pies otwarte, trzeba zakwalifikować skip_before_filter zastosowanie tylko do „Show” działania w następujący sposób:

class Dog < Animal 
    skip_before_filter :authenticate, :only => :show 
end 
2

Wystarczy mała zmiana, że ​​za pomocą szyny 4, to jest teraz skip_before_action :authenticate, :only => :show i że before_filters powinien teraz używać before_action.

+0

To powinno być komentarzem. – dan