Я использую React + Rails для веб-приложения и использую Devise для аутентификации пользователей.Я борюсь с тем, чтобы заставить работать пользовательскую кнопку выхода из системы.
В моем route.rb у меня есть следующее:
devise_for :users do
delete '/users/sign_out' => 'devise/sessions#destroy' #I've also tried get instead of delete
end
Мой devise.rb настроен следующим образом:
config.sign_out_via = :delete
В моем (React) файле JS .jsx у меня есть следующая функция выхода из системы, вызываемая при нажатии кнопки.
function logout() {
fetch("/users/sign_out", {method: 'delete'}).then((response) => { #I have also tried replacing delete with get
}).then((result) => {
window.location.href = '/';
});
}
Когда я использую fetch + delete, я получаю 422ошибка при получении;когда я использую fetch + get, я получаю ошибку 404 от fetch.Я экспериментировал с различными возможными перестановками get / delete в файлах routs / devise.rb и в файле .jsx безуспешно.
В частности, на моей консоли rails я вижу следующее для ошибки 422:
Can't verify CSRF token authenticity. Completed 422 Unprocessable Entity in 4ms (ActiveRecord: 0.5ms)
У моего контроллера приложений есть следующее:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_user!
end
Интересно, если я сделаю это:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
protect_from_forgery prepend: true
before_action :authenticate_user!
end
Тогда ошибка 422 исчезнет (ноприложение по-прежнему действует так, как будто пользователь вошел в систему).