Потратил немного времени на то, чтобы разобраться в этом сам, и подумал, что кто-то еще может найти это полезным.
Действие create в контроллере devise вызывает warden.authenticate!
, которое пытается аутентифицировать пользователя с помощью предоставленных параметров. Если аутентификация не удалась, authenticate!
вызовет приложение сбоя устройства, которое затем запустит действие SessionsController#new
. Обратите внимание, что любые фильтры, которые вы используете для действия create
, не будут работать, если аутентификация не пройдена.
Таким образом, решение заключается в добавлении фильтра после действия new
, который проверяет содержимое env["warden.options"]
и выполняет соответствующее действие.
, например
def instrument_failed_login
instrument "failed_login.staff" if failed_login?
end
def failed_login?
(options = env["warden.options"]) && options[:action] == "unauthenticated"
end