Ответ 1
class Dog < Animal
skip_before_filter :authenticate, :only => :show
end
Подробнее о фильтрах и наследовании см. ActionController:: Filters:: ClassMethods.
Имена и объекты были упрощены для большей ясности. Основная концепция остается прежней.
У меня три контроллера: dog
, cat
и horse
.
Эти контроллеры все наследуются от контроллера animal
.
В контроллере animal
у меня есть фильтр before, который аутентифицирует пользователя как такового:
before_filter :authenticate
def authenticate
authenticate_or_request_with_http_basic do |name, password|
name == "foo" && password == "bar"
end
end
В действии show
dog
я должен иметь открытый доступ для всех пользователей (пропустите аутентификацию).
Если бы я должен был написать аутентификацию отдельно для dog
, я мог бы сделать что-то вроде этого:
before_filter :authenticate, :except => :show
Но так как dog
наследует от animal
, у меня нет доступа к действиям, зависящим от контроллера. Добавление :except => :show
в контроллер animal
не только пропускает аутентификацию для действия show
dog
, но также и cat
и horse
. Такое поведение нежелательно.
Как пропустить аутентификацию только для действия show
dog
, но наследуя от animal
?
class Dog < Animal
skip_before_filter :authenticate, :only => :show
end
Подробнее о фильтрах и наследовании см. ActionController:: Filters:: ClassMethods.
Два приведенных ответа являются наполовину правильными. Чтобы избежать открытого действия всех ваших действий с собакой, вам необходимо квалифицировать skip_before_filter только для применения к действию "show" следующим образом:
class Dog < Animal
skip_before_filter :authenticate, :only => :show
end
Для этого вы можете использовать skip_before_filter
Это объясняется в Rails API
В вашем примере dog
просто нужно было бы содержать
skip_before_filter :authenticate
Просто небольшое обновление, использующее rails 4, теперь skip_before_action :authenticate, :only => :show
и что before_filters теперь должны использовать before_action
.