2009-02-07 13 views
5

Me gustaría crear un enlace en una vista dentro de una aplicación Rails que hace esto ...¿Cómo se envía una solicitud con el verbo HTTP "ELIMINAR"?

DELETE /sessions 

¿Cómo iba a hacer eso.

Agregado complicación:

El recurso de "sesión" no tiene un modelo, ya que representa una sesión de inicio de sesión de usuario. CREATE significa que el usuario inicia sesión, DESTROY significa cerrar sesión.

Es por eso que no hay ID param en el URI.

Estoy tratando de implementar un enlace de "cierre de sesión" en la interfaz de usuario.

Respuesta

18

Correcto, los navegadores en realidad no admiten el envío de solicitudes de eliminación. La convención aceptada de muchos frameworks web es enviar un parámetro _method establecido a 'DELETE', y usar una solicitud POST.

He aquí un ejemplo en Rails:

<%= link_to 'log out', session_path, :method => :delete %> 

Es posible que desee echar un vistazo a Restful Authentication.

1

Corrígeme si me equivoco, pero creo que solo puedes enviar solicitudes POST y GET con un navegador (en HTML).

+1

Correcto; sin embargo, puede enviar solicitudes con verbos arbitrarios usando JavaScript. –

+2

También Rails se ocupa de esto cuando no hay Javascript agregando un campo de entrada oculto llamado _method y configurándolo en PUT/POST/DELETE y luego simula que tiene ese tipo de método HTTP. – Otto

4

No conozco Rails específicamente, pero con frecuencia construyo páginas web que envían solicitudes DELETE (y PUT), usando Javascript. Solo uso objetos XmlHttpRequest para enviar la solicitud.

Por ejemplo, si se utiliza jQuery:

tienen un enlace que se parece a esto:

<a class="delete" href="/path/to/my/resource">delete</a> 

y ejecutar este Javascript:

$(function(){ 
    $('a.delete').click(function(){ 
     $.ajax(
      { 
       url: this.getAttribute('href'), 
       type: 'DELETE', 
       async: false, 
       complete: function(response, status) { 
        if (status == 'success') 
         alert('success!') 
        else 
         alert('Error: the service responded with: ' + response.status + '\n' + response.responseText) 
       } 
      } 
     ) 
     return false 
    }) 
}) 

escribí este ejemplo en su mayoría de la memoria , pero estoy bastante seguro de que funcionará ...

1

El método integrado de Rails para enlaces generará e algo como esto:

<a href="/sessions?method=delete" rel="nofollow">Logout</a> 

Si no desea utilizar el método incorporado de Rails (es decir no quiere que el rel="nofollow", que impide que los rastreadores de motores de búsqueda desde el siguiente enlace), también se puede escribir manualmente el enlace y añadir el atributo data-method, así:

<a href="/sessions" data-method="delete">Logout</a> 

navegadores sólo puede enviar GET/POST solicitudes, por lo que enviará una solicitud GET normal a su servidor Rails. Rails interpretará y enrutará esto como una solicitud DESTROY/DELETE, y llama a la acción apropiada.

Cuestiones relacionadas