Пропустить before_filter в Rails

Имена и объекты были упрощены для большей ясности. Основная концепция остается прежней.

У меня три контроллера: 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?

Ответ 2

Два приведенных ответа являются наполовину правильными. Чтобы избежать открытого действия всех ваших действий с собакой, вам необходимо квалифицировать skip_before_filter только для применения к действию "show" следующим образом:

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

Ответ 3

Для этого вы можете использовать skip_before_filter

Это объясняется в Rails API

В вашем примере dog просто нужно было бы содержать

skip_before_filter :authenticate

Ответ 4

Просто небольшое обновление, использующее rails 4, теперь skip_before_action :authenticate, :only => :show и что before_filters теперь должны использовать before_action.