2009-02-07 6 views
5

Я хотел бы создать ссылку в представлении в рамках приложения Rails, что делает это ...Как вы отправляете запрос с помощью HTTP-запроса «DELETE»?

DELETE /sessions 

Как я могу это сделать.

Добавлено осложнение:

«Сессия» Ресурс не имеет модели, поскольку она представляет собой запись пользователя сеанса. CREATE означает, что пользователь входит в систему, DESTROY означает выход из системы.

Вот почему в URI нет идентификационного параметра.

Я пытаюсь реализовать ссылку «выйти из системы» в пользовательском интерфейсе.

ответ

18

Правильно, браузеры фактически не поддерживают отправку запросов на удаление. Принятое соглашение многих веб-фреймворков заключается в том, чтобы отправить параметр _method на «DELETE» и использовать запрос POST.

Вот пример в Rails:

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

Вы можете посмотреть на Restful Authentication.

1

Исправьте меня, если я ошибаюсь, но я считаю, что вы можете отправлять запросы POST и GET только в браузере (в формате HTML).

+1

Исправить; однако вы можете отправлять запросы с произвольными глаголами, используя JavaScript. –

+2

Также Rails занимается этим, когда нет Javascript, добавляя скрытое поле ввода под именем _method и устанавливая его в PUT/POST/DELETE, а затем притворяется, что он получил такой метод HTTP. – Otto

4

Я не знаю о Rails специально, но я часто создаю веб-страницы, которые отправляют запросы DELETE (и PUT), используя Javascript. Я просто использую объекты XmlHttpRequest для отправки запроса.

Например, если вы используете JQuery:

есть ссылка, которая выглядит следующим образом:

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

И запустить этот 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 
    }) 
}) 

Я написал этот пример в основном из памяти , но я уверен, что это сработает.

1

Встроенный метод Rails для ссылок будет генерировать e что-то вроде этого:

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

Если вы не хотите использовать встроенный метод Rails (т. не хочу rel="nofollow", который предотвращает сканеры поисковой системы с, перейдя по ссылке), вы также можете вручную написать ссылку и добавить атрибут data-method, например, так:

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

Браузеры могут отправить только GET/POST запросов, поэтому это приведет к отправке обычного запроса GET на ваш сервер Rails. Rails интерпретирует и направляет это как запрос DESTROY/DELETE и вызывает соответствующее действие.