Разрабатывая ответ Марсао, я настоятельно рекомендую поместить отладчик в ваш метод ответа CustomFailure, чтобы лучше понять, что происходит.
Class CustomFailure < Devise::FailureApp
def respond
binding.pry
super
end
end
Если вы посмотрите на исходный код FailureApp Devise для метода ответа, очень легко понять, что происходит.
def respond
if http_auth?
http_auth
elsif warden_options[:recall]
recall
else
redirect
end
end
Так, например, чтобы вернуть redirect_url, вам нужно убедиться, что ваши условные коды respond
в конечном итоге вернут redirect
.
Однако, если вы хотите вернуть стандартное состояние 401, как определено в методе http_auth , вы хотите убедиться, что код метода respond
возвращает http_auth
.
Таким образом, стоит взглянуть на определение http_auth?
В частности, обратите внимание на метод: request.xhr?
, который будет возвращать 0 для запросов json (напомним, что 0 в действительности соответствует true в ruby)
def http_auth?
if request.xhr?
Devise.http_authenticatable_on_xhr
else
!(request_format && is_navigational_format?)
end
end
И, возможно, проверьте файл инициализатора / устройства для config.http_authenticatable_on_xhr
или config.navigational_formats
, чтобы контролировать ответ, который вы хотите. Эта конфигурация может реально повлиять на то, что возвращает Devise, и часто может привести к неожиданному поведению из-за того, что он делает здесь под капотом.