ruby on rails - examples - Redirigir Rails después de eliminar usando DELETE en lugar de GET
rails show routes (1)
Tengo una ruta que estoy emitiendo un DELETE
en:
user_authorization_path(@user, authorization)
Golpea bien a mi controlador, el controlador elimina el recurso y luego emite una redirección:
redirect_to edit_user_path(params[:user_id])
El resultado de esto es un error de enrutamiento en la redirección:
ActionController::RoutingError (No route matches [DELETE] "/users/1/edit")
Puedo ver en los carriles de registros que está haciendo lo correcto hasta que la redirección, que está intentando emitir otro DELETE
lugar de un 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")
El depurador de Chrome muestra la solicitud inicial:
Request URL:http://localhost:3000/users/1/authorizations/12
Request Method:DELETE
Status Code:302 Found
Y su seguimiento de la redirección:
Request URL:http://localhost:3000/users/1/edit
Request Method:GET
Status Code:404 Not Found
Entonces, parece que esto indica que el navegador está siguiendo la redirección correctamente, pero Rails ignora el GET
en la llamada de redirección y en su lugar usa DELETE
que resulta en 404 (ya que DELETE
no es compatible con ese recurso, lo cual es incorrecto).
Si simplemente hago un ''GET'' en la URL redirigida, funciona bien.
¿Qué me falta sobre la redirección de Rails después de eliminar? Gracias.
Esto debería arreglarlo de una manera más agradable:
redirect_to edit_user_path(params[:user_id]), status: 303
http://api.rubyonrails.org/classes/ActionController/Redirecting.html
Si está utilizando solicitudes XHR distintas de GET o POST y está redirigiendo después de la solicitud, algunos navegadores seguirán la redirección utilizando el método de solicitud original. Esto puede conducir a un comportamiento no deseado, como un doble DELETE. Para evitar esto, puede devolver un 303 Ver otro código de estado que se seguirá utilizando una solicitud GET.