Пропустить перед фильтром в рельсах


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

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

4 61

4 ответа:

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

посмотреть ActionController:: Filters:: ClassMethods для получения дополнительной информации о фильтрах и наследования.

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

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 вместо.