Пропустить before_filter в Rails - PullRequest
61 голосов
/ 06 марта 2010

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

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

111 голосов
/ 06 марта 2010
class Dog < Animal
  skip_before_filter :authenticate, :only => :show
end

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

12 голосов
/ 01 апреля 2011

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

class Dog < Animal
  skip_before_filter :authenticate, :only => :show
end
3 голосов
/ 06 марта 2010

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

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

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

skip_before_filter :authenticate
2 голосов
/ 09 декабря 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...