Пропустить перед фильтром в рельсах
имена и объекты были упрощены для ясности. Основная концепция остается прежней.
у меня есть три контроллера: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 ответа:
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