2009-02-07 22 views
5

Mi piacerebbe creare un collegamento in una vista all'interno di un'applicazione Rails che fa questo ...Come si invia una richiesta con il verbo HTTP "DELETE"?

DELETE /sessions 

Come dovrei farlo.

Aggiunto complicazione:

la risorsa "sessione" non ha alcun modello perché rappresenta una sessione di login utente. CREATE significa che l'utente effettua l'accesso, DESTROY significa disconnettersi.

Ecco perché non c'è alcun parametro ID nell'URI.

Sto tentando di implementare un collegamento "Disconnetti" nell'interfaccia utente.

risposta

18

Corretto, i browser non supportano effettivamente l'invio di richieste di eliminazione. La convenzione accettata da molti framework Web è quella di inviare un parametro _method impostato su "DELETE" e utilizzare una richiesta POST.

Ecco un esempio in Rails:

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

Si consiglia di dare un'occhiata a Restful Authentication.

1

Correggetemi se ho torto, ma credo che si possano inviare solo richieste POST e GET con un browser (in HTML).

+1

Corretto; tuttavia, puoi inviare richieste con verbi arbitrari usando JavaScript. –

+2

Anche Rails si occupa di esso quando non c'è Javascript aggiungendo un campo di input nascosto chiamato _method e impostandolo su PUT/POST/DELETE e quindi finge di avere quel tipo di metodo HTTP. – Otto

4

Non so specificamente su Rails, ma di solito costruisco pagine web che inviano richieste DELETE (e PUT), usando Javascript. Io uso solo oggetti XmlHttpRequest per inviare la richiesta.

Per esempio, se si utilizza jQuery:

hanno un collegamento che assomiglia a questo:

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

ed eseguire questo 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 
    }) 
}) 

ho scritto questo esempio per lo più dalla memoria , ma sono abbastanza sicuro che funzionerà ....

1

Il metodo integrato per i collegamenti dei collegamenti genererà E qualcosa del genere:

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

Se non si desidera utilizzare il metodo integrato di Rails (ad es. Non voglio che il rel="nofollow", che impedisce i crawler dei motori di ricerca di seguire il link), è anche possibile scrivere manualmente il collegamento e aggiungere l'attributo data-method, in questo modo:

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

browser possono inviare solo GET/POST richieste, quindi invierà una normale richiesta GET al tuo server Rails. Rails interpreterà e instraderà questo come richiesta DESTROY/DELETE e chiama l'azione appropriata.

Problemi correlati