Rails Redirect После удаления с помощью DELETE вместо GET - программирование
Подтвердить что ты не робот

Rails Redirect После удаления с помощью DELETE вместо GET

У меня есть маршрут, я выдаю DELETE on:

user_authorization_path(@user, authorization)

Он отлично меняет мой контроллер, контроллер удаляет ресурс, а затем выдает перенаправление:

redirect_to edit_user_path(params[:user_id])

Результатом этого является ошибка маршрутизации при перенаправлении:

ActionController::RoutingError (No route matches [DELETE] "/users/1/edit")

Я вижу, что в журналах рельсы делают правильные действия до перенаправления, которые он пытается выдать еще один DELETE вместо GET:

Started DELETE "/users/1/authorizations/12"...
...
Redirected to http://localhost:3000/users/1/edit
Completed 302 Found in 8ms (ActiveRecord: 0.2ms)

Started DELETE "/users/1/edit"...

ActionController::RoutingError (No route matches [DELETE] "/users/1/edit")

Отладчик Chrome показывает начальный запрос:

Request URL:http://localhost:3000/users/1/authorizations/12
Request Method:DELETE
Status Code:302 Found

И его следующее перенаправление:

Request URL:http://localhost:3000/users/1/edit
Request Method:GET
Status Code:404 Not Found

Итак, похоже, что браузер правильно выполняет перенаправление, но рельсы игнорируют GET при вызове перенаправления и вместо этого используют DELETE, что приводит к 404 (поскольку DELETE не поддерживается этим ресурсом - в любом случае это неправильно).

Если я просто делаю "GET" на перенаправленном URL-адресе, он отлично работает.

Что мне не хватает в перенаправлении Rails после удаления? Спасибо.

4b9b3361

Ответ 1

Это должно исправить это лучше:

redirect_to edit_user_path(params[:user_id]), status: 303

http://api.rubyonrails.org/classes/ActionController/Redirecting.html

Если вы используете запросы XHR, отличные от GET или POST, и перенаправление после запроса затем некоторые браузеры будут следовать за перенаправлением, используя первоначальный метод запроса. Это может привести к нежелательному поведению например, двойной DELETE. Чтобы обойти это, вы можете вернуть 303 См. Другой код состояния, который будет выполняться с использованием запроса GET.

Ответ 2

В моем случае метод вызывает действие delete, и после его завершения он перенаправляет, чтобы показать действие, поэтому я исправил его, возвращая код состояния 204