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