rails examples ruby-on-rails redirect routes http-delete

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.