views:

760

answers:

3

I'd like to create a link in a view within a Rails application that does this...

DELETE /sessions

How would I do that.

Added complication:

The "session" resource has no model because it represents a user login session. CREATE means the user logs in, DESTROY means logs out.

That's why there's no ID param in the URI.

I'm trying to implement a "log out" link in the UI.

A: 

Correct me if I'm wrong, but I believe you can only send POST and GET requests with a browser (in HTML).

Mario
Correct; however, you can send requests with arbitrary verbs using JavaScript.
Aaron Maenpaa
Also Rails deals with it when there's no Javascript by adding a hidden input field called _method and setting it to PUT/POST/DELETE and then pretends it got that kind of HTTP method.
Otto
+10  A: 

Correct, browsers don't actually support sending delete requests. The accepted convention of many web frameworks is to send a _method parameter set to 'DELETE', and use a POST request.

Here's an example in Rails:

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

You may want to have a look at Restful Authentication.

Jim Benton
+3  A: 

I don't know about Rails specifically, but I frequently build web pages which send DELETE (and PUT) requests, using Javascript. I just use XmlHttpRequest objects to send the request.

For example, if you use jQuery:

have a link that looks like this:

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

And run this 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
    })
})

I wrote this example mostly from memory, but I'm pretty sure it'll work....

Avi Flax